n^2约等于10的5次方,写成n
解法一:排序。 时间复杂度O(nlogn)

class Solution {public:int kthSmallest(vector<vector<int>>& matrix, int k) {vector<int> nums;for (auto& row : matrix) {for (auto& each : row) {nums.push_back(each);}}sort(nums.begin(), nums.end());return nums[k - 1];}
};

解法二:优先队列(大顶堆)。 时间复杂度O(nlogn)

class Solution {public:int kthSmallest(vector<vector<int>>& matrix, int k) {priority_queue<int> pq;for (auto& row : matrix) {for (auto& each : row) {if (pq.size() < k) pq.push(each);else if (each < pq.top()) {pq.pop();pq.push(each);} }}return pq.top();}
};

解法三:多路归并 (利用了行递增的特点)时间复杂度O(nlogn)
具体:用优先队列保存每一行的最小值,如果该元素所在位置后面还有元素就把下一个元素放到堆中。top出k-1次后top即需要的值。
易错点:维护的是一个小顶堆而不是大顶堆

class Solution {public:struct cmp {bool operator()(vector<int>& v1, vector<int>& v2) const{return v1[0] > v2[0]; //'>'表示小顶堆}};int kthSmallest(vector<vector<int>>& matrix, int k) {vector<int> elem;priority_queue<vector<int>, vector<vector<int>>, cmp> pq;int n = matrix.size();for (int i = 0; i < n ;++i) {pq.push(vector<int>{matrix[i][0], i, 0});}for (int i = 0; i < k - 1; ++i) {auto tp = pq.top();pq.pop();if (tp[2] < n - 1) {pq.push(vector<int>{matrix[tp[1]][tp[2] + 1], tp[1], tp[2] + 1});}}return pq.top()[0];}
};

解法四:二分查找(同时利用行 列均递增的特点)时间复杂度O(nlog(r-l)) 最优!!!
细节:将矩阵分成两部分,左边所有的元素均小于等于mid,统计出左半部分元素的个数cnt,也就是找出一个最小的mid值,满足cnt >= k

class Solution {public:int kthSmallest(vector<vector<int>>& matrix, int k) {int n = matrix.size();int l = matrix[0][0] - 1, r = matrix[n - 1][n - 1] + 1;while (l + 1 < r) {int mid = l + (r - l) / 2;int cnt = 0; int j = 0;for (int i = 0; i < n; ++i) {if (i == 0) { //i == 0时用二分j = upper_bound(matrix[0].begin(),matrix[0].end(),mid)-matrix[0].begin();}else { //i > 0时j向左移动while (j - 1 >= 0 && matrix[i][j - 1] > mid) --j;}if (j == 0) break;cnt += j;}if (cnt >= k) r = mid;else l = mid;     }return r;}
};

leetcode378.有序矩阵中第K小的元素(中等)相关推荐

  1. leetcode378. 有序矩阵中第K小的元素(Python3)

    文章目录 leetcode378. 有序矩阵中第K小的元素 方法一:直接排序 思路: 代码: 结果: 方法二:二分查找 思路: 代码: 结果: leetcode378. 有序矩阵中第K小的元素 给定一 ...

  2. leetcode378. 有序矩阵中第 K 小的元素

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

  3. LeetCode-378.有序矩阵中第k小的元素、二分查找

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

  4. 二分、数组-LeetCode378. 有序矩阵中第K小的元素

    1.题目描述 https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/ 给定一个 n x n 矩阵,其中每行和 ...

  5. 【堆】leetcode378.有序矩阵中第K小的元素

    题目: 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素. 思路: 求第 ...

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

    2020-05-25 1.题目描述 有序矩阵中第K小的元素 2.题解 1.优先队列 2.使用二分查找 class Solution { public:int kthSmallest(vector< ...

  7. python n个list如何组成矩阵_有序矩阵中第K小的元素amp;x的平方根(二分法篇)

    69. x的平方根 题目描述: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例1: ...

  8. Leetcode刷题100天—378. 有序矩阵中第 K 小的元素(优先队列)—day16

    前言: 作者:神的孩子在歌唱 大家好,我叫运智 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是 ...

  9. [leetcode]378. 有序矩阵中第 K 小的元素

    378. 有序矩阵中第 K 小的元素 题目链接 思路分析 代码实现 题目链接 378. 有序矩阵中第 K 小的元素 思路分析 题目中又一次提到了有序,就能够猜想能够使用二分法 那么如果要使用二分的话, ...

最新文章

  1. python面向对象编程 Object-Oriented
  2. 软件测试基础 - 测试覆盖率
  3. “以史为鉴”-企业信息化的梳理-前言
  4. Java 进阶 ——2019 计划要读的书
  5. linux 命令 考试,linux常用命令总结-第一次考试
  6. pyqt2_官网教程
  7. linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
  8. mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法
  9. logon oracle 密码 用户名_PLSQL自动登录,记住用户名密码日常使用技巧
  10. laravel 5 自定义全局函数,怎么弄呢?
  11. Ansible Tower - 使用入门 4 - 用 Workflow 执行模板
  12. arp欺骗的软件有哪些_局域网内如何防止ARP欺骗
  13. python发邮件主机找不到_从本地主机(不登录STMP服务器)用Python发送电子邮件时,如何解决套接字错误?...
  14. 如何进入ThinkSystem系列服务器SAS RAID阵列配置界面
  15. MATLAB矩阵及其运算
  16. ArcGIS椭球面积计算Python代码
  17. 日知录(七):python之理解pygame飞机大战
  18. 弘辽科技:拼多多懵懂商家不知道的直通车操作
  19. Java多线程-任务拒绝策略
  20. “沉浸式大型线下游戏”?看看这次腾讯TGC上如何玩很大!

热门文章

  1. ABP VNext学习日记6
  2. EasyUI之树形菜单选项卡前端应用
  3. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 5 Octave Tutorial
  4. 在k线画出买卖点---pyecharts
  5. 3.Sunday算法的一个小优化
  6. 四款小众但非常实用的软件推荐
  7. java沙漏_(java)五大常用算法
  8. 大数据时代,企业如何进行有效的信息资源整合?
  9. EXP-00002错误解决方法
  10. VB.net:VB.net编程语言学习之添加引用打包安装项目的简介、案例应用之详细攻略