378. 有序矩阵中第K小的元素
Q:

A:
//O(NK)
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int m=matrix.size();
int cnt=0;
vector<int> indexes(m,0);
int min_index=0,min_val=INT32_MAX;
while(cnt<k){
min_val=INT32_MAX;
for(int i=0;i<m;++i){
if (indexes[i]<m and matrix[i][indexes[i]]<min_val){
min_val=matrix[i][indexes[i]];
min_index=i;
}
}
indexes[min_index]+=1;
cnt++;
}
return min_val;
}
};
最小堆,n路归并k次
//O(KlogN)
struct point
{
int x,y,val;
point():x(0),y(0),val(0){}
point(int a,int b,int c):x(a),y(b),val(c){}
};
bool cmp(point& a,point& b){
return a.val>b.val;
}
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int m=matrix.size();
int cnt=0;
vector<point> vec;
for(int i=0;i<m;i++){
vec.push_back(point(i,0,matrix[i][0]));
}
make_heap(vec.begin(),vec.end(),cmp);
int res=0;
while(cnt<k){
res=vec[0].val;
pop_heap(vec.begin(),vec.end(),cmp);
vec.back().y++;
if (vec.back().y>=m){
vec.pop_back();
}
else{
point p=vec.back();
vec.back().val=matrix[p.x][p.y];
}
if (vec.empty()){
return res;
}
push_heap(vec.begin(),vec.end(),cmp);
cnt++;
}
return res;
}
};
二分,不断二分矩阵直到分出前k个元素。
//O(NlogN)
class Solution {
public:
// O(nlogn)
int kthSmallest(vector<vector<int>>& matrix, int k) {
int lo = matrix[0][0], hi = matrix.back().back();
// O(log(max_val - min_val)) = O(1),32 位整型最多 32 次
while (lo < hi) {
int mid = lo + (hi - lo >> 1);
int count = 0;
// O(n)
for (int i = 0; i < matrix.size(); ++i) {
// O(logn)
count += search(matrix[i], mid); // <= mid 的元素个数
}
if (k <= count) {
hi = mid;
} else {
lo = mid + 1;
}
}
return lo;
}
// 标准 upperbound 模板。查找第一个 > target 的元素的位置。
// 也就是 <= target 的元素的个数。
int search(vector<int>& row, int target) {
int lo = 0, hi = row.size();
while (lo < hi) {
int mid = lo + (hi - lo >> 1);
if (row[mid] > target) {
hi = mid;
} else {
lo = mid + 1;
}
}
return lo;
}
};
378. 有序矩阵中第K小的元素的更多相关文章
- LeetCode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix) 13
378. 有序矩阵中第K小的元素 378. Kth Smallest Element in a Sorted Matrix 题目描述 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩 ...
- Java实现 LeetCode 378 有序矩阵中第K小的元素
378. 有序矩阵中第K小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ ...
- Leetcode 378.有序矩阵中第k小的元素
有序矩阵中第k小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, ...
- leetcode.矩阵.378有序矩阵中第K小的元素-Java
1. 具体题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, 5, ...
- [LeetCode] 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
- [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
- 【Leetcode 堆、快速选择、Top-K问题 BFPRT】有序矩阵中第K小的元素(378)
题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, 5, 9], [ ...
- 378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [ [ 1, 5, 9], [ ...
- [Swift]LeetCode378. 有序矩阵中第K小的元素 | Kth Smallest Element in a Sorted Matrix
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...
随机推荐
- [SDOI2012] Longge的问题 - 欧拉函数
求 \(\sum\limits_{i=1}^{n}gcd(i,n)\) Solution 化简为 \(\sum\limits_{i|n}^{n}φ(\dfrac{n}{i})i\) 筛出欧拉函数暴力求 ...
- redis五大数据类型以及常用操作命令
Redis的五大数据类型 String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.string类型是二进制安全的.意 ...
- 04-Java基础语法【IDEA、方法】
重要内容记录: 01.IDE介绍 IDE(Integarted Development Environment)是Java集成开发环境,是一种专门用来提高Java开发效率的软件. 免费的IDE:Ecl ...
- ApiBehaviorOptions 统一模型验证配置不生效
ApiBehaviorOptions 的统一模型验证配置一定要放到(.AddMvc)后面.
- 2.2测试赛AC代码临时保存
//A #include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> ...
- [Web安全]SQL注入
Web网站最头痛的就是遭受攻击.Web很脆弱,所以基本的安防工作,我们必须要了解! 所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意 ...
- struts2中的constant常量配置
struts2中的constant配置详解 本文主要讲解一下struts2中的constant常量配置,内容主要来自于互联网的整理.<?xml version="1.0" e ...
- python:运行command
#!/usr/bin/python# -*- coding:utf-8 -*- import os os.system('cocos jscompile -s ./dir1 -d ./dir2')
- mysql数据库测试脚本
背景: 对mysql的底层代码进行了重构,需要回归测试mysql的基本功能 测试目标: 涵盖功能点如下 1.创建库,删除库,重命名库 2.创建表(需要涵盖所有基本的数据类型,主键,自增,默认值,不允许 ...
- 转载:TDM协议
转自http://www.wangdali.net/i2s/ 1. PCM简介 PCM (Pulse Code Modulation) 是通过等时间隔(即采样率时钟周期)采样将模拟信号数字化的方法.图 ...