leetcode378.有序矩阵中第K小的元素(中等)
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小的元素(中等)相关推荐
- leetcode378. 有序矩阵中第K小的元素(Python3)
文章目录 leetcode378. 有序矩阵中第K小的元素 方法一:直接排序 思路: 代码: 结果: 方法二:二分查找 思路: 代码: 结果: leetcode378. 有序矩阵中第K小的元素 给定一 ...
- leetcode378. 有序矩阵中第 K 小的元素
378. 有序矩阵中第 K 小的元素 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 ...
- LeetCode-378.有序矩阵中第k小的元素、二分查找
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素.请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素.示例:matrix = [ [ 1, 5, 9] ...
- 二分、数组-LeetCode378. 有序矩阵中第K小的元素
1.题目描述 https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/ 给定一个 n x n 矩阵,其中每行和 ...
- 【堆】leetcode378.有序矩阵中第K小的元素
题目: 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素. 思路: 求第 ...
- 378. 有序矩阵中第K小的元素
2020-05-25 1.题目描述 有序矩阵中第K小的元素 2.题解 1.优先队列 2.使用二分查找 class Solution { public:int kthSmallest(vector< ...
- python n个list如何组成矩阵_有序矩阵中第K小的元素amp;x的平方根(二分法篇)
69. x的平方根 题目描述: 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例1: ...
- Leetcode刷题100天—378. 有序矩阵中第 K 小的元素(优先队列)—day16
前言: 作者:神的孩子在歌唱 大家好,我叫运智 给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是 排序后 的第 k 小元素,而不是 ...
- [leetcode]378. 有序矩阵中第 K 小的元素
378. 有序矩阵中第 K 小的元素 题目链接 思路分析 代码实现 题目链接 378. 有序矩阵中第 K 小的元素 思路分析 题目中又一次提到了有序,就能够猜想能够使用二分法 那么如果要使用二分的话, ...
最新文章
- python面向对象编程 Object-Oriented
- 软件测试基础 - 测试覆盖率
- “以史为鉴”-企业信息化的梳理-前言
- Java 进阶 ——2019 计划要读的书
- linux 命令 考试,linux常用命令总结-第一次考试
- pyqt2_官网教程
- linux rz sz 安装_Windows与Linux文件传输之lrzsz工具
- mysql保存时乱码了_MySQL保存中文乱码的原因和解决办法
- logon oracle 密码 用户名_PLSQL自动登录,记住用户名密码日常使用技巧
- laravel 5 自定义全局函数,怎么弄呢?
- Ansible Tower - 使用入门 4 - 用 Workflow 执行模板
- arp欺骗的软件有哪些_局域网内如何防止ARP欺骗
- python发邮件主机找不到_从本地主机(不登录STMP服务器)用Python发送电子邮件时,如何解决套接字错误?...
- 如何进入ThinkSystem系列服务器SAS RAID阵列配置界面
- MATLAB矩阵及其运算
- ArcGIS椭球面积计算Python代码
- 日知录(七):python之理解pygame飞机大战
- 弘辽科技:拼多多懵懂商家不知道的直通车操作
- Java多线程-任务拒绝策略
- “沉浸式大型线下游戏”?看看这次腾讯TGC上如何玩很大!