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. 1级搭建类103-Oracle 12c 单实例 FS(12.2.0.1+RHEL 7)公开

    项目文档引子系列是根据项目原型,制作的测试实验文档,目的是为了提升项目过程中的实际动手能力,打造精品文档AskScuti. 项目文档引子系列目前不对外发布,仅作为博客记录.如学员在实际工作过程中需提前 ...

  2. Flutter简易顶部导航

    因为在AppBar的bottom参数中返回TabBar在平板模式的对齐模式是居中的且不可调整,所有将TabBar在title中返回 import 'package:flutter/material.d ...

  3. @Configuration@Bean

    https://blog.csdn.net/u014199143/article/details/80692685 @Configuation等价于<Beans></Beans> ...

  4. 51nod(1174 区间中最大的数)(ST表模板题)

    1174 区间中最大的数 1.0 秒 131,072.0 KB 0 分 基础题   给出一个有N个数的序列,编号0 - N - 1.进行Q次查询,查询编号i至j的所有数中,最大的数是多少. 例如: 1 ...

  5. 免费馅饼 HDU - 1176 基础dp

    /*题都是有一个状态转移方程式 , 只要推出方程式就问题不大了,首 先对于gameboy来说他下一秒只能 在0~10这十一个位置移动, 而对于1~9这九个位置来说他可以移动(假设他现在的位置为x)到x ...

  6. setUserData

    node.setUserData();//设置每个节点的datanode.getUserData();

  7. 题解【洛谷P2070】刷墙

    题面 将每一次移动的距离进行差分,前缀和判断移动的距离是否\(\geq 2\)即可. #include <bits/stdc++.h> #define itn int #define gI ...

  8. Linux oracle中文乱码的问题解决

    乱码问题的根源是字符集的修改 1.查看linux的默认语言 2.查看客户端的语言编码设置 配置文件中的配置: cat  ~/.bash_profile 注意修改配置信息: export PATHexp ...

  9. echart --toolbox

    1.自定义的toolbox 消息回调 toolbox: { show: true, itemSize: 32, borderColor: '#0cb1b6', borderWidth: 1, bord ...

  10. Linux内核源码阅读记录一之分析存储在不同段中的函数调用过程

    在写驱动的过程中,对于入口函数与出口函数我们会用一句话来修饰他们:module_init与module_exit,那会什么经过修饰后,内核就能狗调用我们编写的入口函数与出口函数呢?下面就来分析内核调用 ...