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小的元素的更多相关文章

  1. LeetCode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix) 13

    378. 有序矩阵中第K小的元素 378. Kth Smallest Element in a Sorted Matrix 题目描述 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩 ...

  2. Java实现 LeetCode 378 有序矩阵中第K小的元素

    378. 有序矩阵中第K小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ ...

  3. Leetcode 378.有序矩阵中第k小的元素

    有序矩阵中第k小的元素 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, ...

  4. leetcode.矩阵.378有序矩阵中第K小的元素-Java

    1. 具体题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1,  5, ...

  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 ...

  6. [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 ...

  7. 【Leetcode 堆、快速选择、Top-K问题 BFPRT】有序矩阵中第K小的元素(378)

    题目 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素. 请注意,它是排序后的第k小元素,而不是第k个元素. 示例: matrix = [ [ 1, 5, 9], [ ...

  8. 378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [   [ 1,  5,  9],   [ ...

  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 ...

随机推荐

  1. docker镜像ubuntu封装jdk1.8.0【dockerfile】

    github地址:https://github.com/laileman/Docker/Dockerfile/ubuntu-jdk1.8.0_172 1-目录结构 2- dockerfile内容 3- ...

  2. mysql 行锁 表锁

    MySQL数据库 - 引擎: - innodb - 支持事务 - 锁 - 行锁 - 表锁 - 示例: - 终端: begin; select xx from xx for update; commit ...

  3. Apache服务:使用 Apache 服务部署静态网站

    1.安装Apache服务 第一步:安装Apache服务程序   yum install httpd 具体流程参考https://www.cnblogs.com/python-wen/p/1016845 ...

  4. Java中8进制数和16进制数的表示方法

    由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题.  但,二进制数太长了.比如int   类型占用4个字节,32位.比如100,用int类型的二进制数表达将 ...

  5. 立即关机C++源码

    #include<windows.h> using namespace std; int main(){ system("shutdown /p"); return 0 ...

  6. C编译过程

    system()调用系统命令 C语言源代码——> 预编译(1.去掉注释:2.包含文件)——> gcc -o a.o a.c 编译(编译成二进制质量)——> 链接系统库函数——> ...

  7. 【Linux】解决Linux服务器内存不足问题

    在Linux服务器上使用Jmeter进行压测的时候,遇到了一个错误: 根据这里的提示: Java HotSpot(TM) -Bit Server VM warning: INFO: os::commi ...

  8. 4-初识Django Admin

    初识Django Admin Django Admin是Django为我们提供的网站后台管理应用,通常网站,个人博客,CMS等都会有个后台管理界面,这个界面只有管理员权限的用户才能进入管理网站内容.管 ...

  9. 为什么 K8s 在阿里能成功(转)

    为什么 K8s 在阿里能成功?| 问底中国 IT 技术演进   作者:曾凡松 阿里云云原生应用平台高级技术专家张振 阿里云云原生应用平台高级技术专家 导读:本文描述了阿里巴巴在容器管理领域的技术演进历 ...

  10. 高级特征工程I

    Mean encodings 以下是Coursera上的How to Win a Data Science Competition: Learn from Top Kagglers课程笔记. 学习目标 ...