当前位置:网站首页>leetcode:378. 有序矩阵中第 K 小的元素
leetcode:378. 有序矩阵中第 K 小的元素
2022-07-16 07:15:00 【OceanStar的学习笔记】
题目来源
题目描述


class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
}
};
题目解析
分析数据
(1)数据量。从下面可以看出:
- 这是一个正方形。
- 最大数据量: 300 ∗ 300 = 6 ∗ 1 0 4 300 * 300 = 6 * 10^4 300∗300=6∗104
- 算法复杂度不能是 O ( N 2 ) O(N^2) O(N2),因为会超过 1 0 8 10^8 108
- 至少应该是 O ( N ∗ l o g N ) O(N * logN) O(N∗logN)

(2)数据特性
- 值域比较大,所以填表法pass
- 从左到右递增,从上往下递增,
- 也就是它们具有单调性, 因此,思考:如何利用它呢?可不可以二分或者利用这个特性淘汰某些数据呢?
- 另外,matrix[0][0]是最小值,matrix[n-1][n-1]是最大值。
- 从k的取值范围可以看出k可以找到矩阵中的任意一个数

二分(最优解)
思路
- 整个矩阵中最小的数是左上角的数(假设为1),最大的数是右下角的数(假设为1000)。
- 第k小的数(假设k=100)一定在[1, 1000]之间。
- 怎么找这个k小的数呢?
- 先找<= 500的数有几个? 如果有200个,那么目标大了,因此
- 再找<= 250的数有几个?如果有50个,那么目标小了,因此
- 再找<=375的数有几个?如果刚好有100个,但是数组中并不一定有这个数,那么应该是<=375(>375的数一定会被淘汰)并且离它最近的那个数
- 因此,每一次二分都应该返回两个信息:
- <= 某一个值的个数有几个?
- 最接近它的是谁?
问题

思路:要求小于等于target的
- 尽量淘汰比target大的(列)
- 尽量保留小于等于target的(行)
从这里我们可以发现一个性质,
- 任取一个数x满足 l < = x < = r l <= x <= r l<=x<=r,那么矩阵中不大于 midx 的数,肯定全部分布在矩阵的左上角。
- 例如下图,取 x=8:

问题

代码
复杂度: O((N + M) * log(max - min))
归并排序(使用堆)
思路
在整个矩阵中,每次弹出矩阵中最小的值,第k个被弹出的就是我们想要的数据
那么,每次弹出矩阵中最小的值呢?
当我们看到下面这个有序矩阵时,我们知道左上角的数字是整个矩阵最小的。

但是弹出它之后,如何能够保证接下来每一次都还能找到全矩阵中最小的值呢?
解决这个问题的关键,在于维护一组“最小值候选人”。
需要保证的是最小值必然从这组候选人中产生,于是每次只要从候选人中弹出一个最小的就可以了。
我们来选择第一组候选人,在这里可以选择第一列,因为每一个数字都是其对应行的最小值,全局最小必然在其中

第一次弹出很简单,将左上角的1弹出即可。
1弹出之后,我们如何找到下一个候选人呢?

很简单,刚才弹出的位置右移一格就行了,这样不是还能保证候选人链表中每一个数字都是每一行的最小值吗,那全局最小值必然在其中!
我们每次弹出候选人当中的最小值,然后把上次弹出候选人的右边一个补进来,就能一直保证全局最小值在候选人列表中产生,
···
边栏推荐
- 基于NvidiaGPU的AI模型结构优化
- Detailed explanation of the decision table method of common test case design methods
- VS2019 16.8 “消失“的团队资源管理器
- Andersen Global进军卢旺达
- Information retrieval summit sigir2022 best paper award came out, Melbourne Institute of technology best paper, UMass University and other best short papers
- Summary of domestic open source mirror websites
- 金字塔思维学习
- VS2019 内联汇编开发
- Know Baidu AI development platform
- Implementation of thread pool
猜你喜欢
![[daily training] 515 Find the maximum value in each tree row](/img/84/51ceab335f933846934ed2523f31f3.png)
[daily training] 515 Find the maximum value in each tree row

PyCharm中Opencv库不能自动补全【2022年7月】

RS485接口OSI模型的应用层

Flutter精品学习路线(知识分类+学习资料)
![(manual) [sqli labs40, 41] stack injection, blind injection](/img/72/d3e46a820796a48b458cd2d0a18f8f.png)
(manual) [sqli labs40, 41] stack injection, blind injection

86 touch switch / desk fan / air conditioner / smart home / home appliances, etc., low power consumption, high anti-interference, 3-key, 3-way, 3-way touch ic-vk3603 esop8, stable performance and adju

Distributed notes (01) - theory and principle of distributed cap

Overcome the challenges of digital transformation by developing a vision

重新认识你的NFT

Full link voltage test: preparations for the test
随机推荐
RGB图像上的密文--违规数据隐藏
金字塔思维学习
Manthan, Codefest 19 (open for everyone, rated, Div. 1 + Div. 2) - B, C, D
The bottom logic of learning essence
CV2. Setmousecallback() displays the pixel value and position of the mouse click image
2022 pole technology communication - anmou technology opens a new chapter of commercialization
C1083: 无法打开包括文件:“corecrt.h”
指针进阶(五)——回调函数
Esri推出用于设施寻路的室内定位系统
Characteristics of Lora technology in wireless communication
【LeetCode】9. Flood fill · image rendering
Flutter boutique learning route (knowledge classification + learning materials)
Andersen Global进军卢旺达
page-break-before\page-break-inside\page-break-after用法
移远通信助力夏粮存储新招式,科技手段更有效
Vulnhub-dc5 learning notes
[server data recovery] a case of RAID5 data recovery of an IBM model storage
爱科荣获2022年红点奖:设计概念奖
Vulnhub-dc7 learning notes
Splash integrates with Acronis to provide scalable remote support