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 ...
随机推荐
- threadpool 实例介绍第二篇
- 【Unity|C#】基础篇(21)——常用类
- Eclispe WEB项目 转到 IDEA 后无法部署问题
IDEA是个强大的IDE 这个就不用多说了 Eclispe 的Web项目 转到IDEA之后,开始部署会出现大量的问题 项目从SVN下载下来的时候,大概就是这个样 第一步是先设置 项目结构 也就 ...
- Java改变引用数据类型的值
Java改变引用数据类型的值 在Java中,引用数据类型的数据传递的是值(地址)的拷贝 对于以下代码 class BirthDate { private int day; private int mo ...
- AcWing 1058. 股票买卖 V
//初始状态(入口)转移到手中无货的第>=2天 //最终状态(出口)可能从手中无货的第一天转移过来,或者从手中无货的第>=2天 //f[i,0]表示走到第i天,且位于手中有货的状态 //f ...
- setTimeout(call,0)作用
setTimeout(call,0)作用 经常看到setTimeout延时0ms的javascript代码,感到很迷惑,难道延时0ms和不延时不是一个道理吗?后来通过查资料以及实验得出以下两个作用, ...
- 阿里云Linux服务器安装Redis 完整步骤(包括处理远程连接问题)
跟随本篇文章步骤,包你成功安装并连接使用. 1.获取redis资源 wget http://download.redis.io/releases/redis-4.0.8.tar.gz 2.解压 tar ...
- 杭电oj_2047——阿牛的EOF牛肉串(java实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2047 思路:先是列出了四个,但是没发现规律,然后开始画递归树,在其中找到了规律,算出递归式为f(n) ...
- 番外:Oracle 中关于 Control File 的备份说明
番外系列说明:该系列所有文章都将作为独立篇章进行知识点讲解,是对其他系列博文进行的补充说明,来自于博客园AskScuti. 主题:关于 Control File 控制文件备份的说明 内容预览:本篇涉及 ...
- C# Timer 控件的用法
一.主要的属性 在 Windows 窗体应用程序中,定时器控件(Timer)与其他的控件略有不同,它并不直接显示在窗体上,而是与其他控件连用. Enabled 属性: 用于设置该Timer控件是否可用 ...