一、题目描述
二、解题思路
- 暴力法:将二维
vector
保存到一维数组,排序后输出第k
个。不过这样做就没什么意思了 k
路归并排序法:也就是我选择的方法- 我们可以设定一个数组
a[matrix.size()]
,该数组的下标代表着matrix
的行,其值代表着该行的指针位置。 - 该题需要注意的地方为:你需要知道当前该行是否已经全部排好序。
- 如果还没有全部排好,那么
a[i]
的值一定小于matrix.size()
- 否则(
a[i]
的值大于matrix.size()
),需要找到当前首个还没有全部排完的那一行(由该matrix
的性质,这一行一定在没排好的那些行的最前面)
- 如果还没有全部排好,那么
- 我们可以设定一个数组
- 堆排序法:因为是求“前
k
小”,根据我之前的文章,求前k
大使用小顶堆,反之使用大顶堆。本题我们可以维护一个大小为k
的大顶堆,遍历一遍vector
,当堆的大小为k
时返回堆顶元素
三、解题代码
归并排序做的
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
auto n = matrix.size();
vector<int> a(n, 0);
int sln;
while(k){
int min = 0;
for(min = 0; a[min] >= n; min++);
for(int j = min; j < n; j++){
if(matrix[j][a[j]] < matrix[min][a[min]]){
min = j;
}
}
sln = matrix[min][a[min]];
a[min]++;
k--;
}
return sln;
}
};
四、运行结果
我以为不会这么慢的,不过也认了。毕竟时间复杂度为