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. css权重及计算

    一.一般而言:!important--->行间样式--->id--->class | 属性--->标签选择器--->通配符 二.权重值 !important        ...

  2. 本地.local域名访问实现

    苹果的 Bonjour 的多址广播域名服务(mDNS) 使用".local "后缀来识别 Bonjour 可访问的设备 比如树莓派可以用用raspberrypi.local去访问非 ...

  3. JavaDay2(上)

    Java learning_Day2(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...

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

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

  5. 机器学习作业(七)非监督学习——Matlab实现

    题目下载[传送门] 第1题 简述:实现K-means聚类,并应用到图像压缩上. 第1步:实现kMeansInitCentroids函数,初始化聚类中心: function centroids = kM ...

  6. [POI2010] GRA-The Minima Game - 贪心,dp,博弈论

    给出N个正整数,AB两个人轮流取数,A先取.每次可以取任意多个数,直到N个数都被取走.每次获得的得分为取的数中的最小值,A和B的策略都是尽可能使得自己的得分减去对手的得分更大.在这样的情况下,最终A的 ...

  7. PP: Think globally, act locally: A deep neural network approach to high-dimensional time series forecasting

    Problem: high-dimensional time series forecasting ?? what is "high-dimensional" time serie ...

  8. SSM+layui实现增删改查

    前端使用layui框架,后端使用Spring+SpringMVC+Mybatis的集合框架,数据库使用MySQL,完成对一张用户表的增删改查操作. 前后端分离开发,即前端的HTML页面通过ajax技术 ...

  9. opencv3.2.0+opencv_contrib-3.2.0+vs2015相关文件的配置

    包含目录:E:\opencvcontrib\opencv\sources\build\install\include\opencv E:\opencvcontrib\opencv\sources\bu ...

  10. logistic回归损失函数(非常重要,深入理解)

    2.2 logistic回归损失函数(非常重要,深入理解) 上一节当中,为了能够训练logistic回归模型的参数w和b,需要定义一个成本函数 使用logistic回归训练的成本函数 为了让模型通过学 ...