Note that it is the kth smallest element in the sorted order, not the kth distinct element.
Example:
matrix = [
[ 1, 5, 9],
[10, 11, 13],
[12, 13, 15]
],
k = 8,
return 13.
Note:
You may assume k is always valid, 1 ≤ k ≤ n2.
解法一:
binary search
class Solution
{
public:
int kthSmallest(vector<vector<int>>& matrix, int k)
{
int n = matrix.size();
int le = matrix[0][0], ri = matrix[n - 1][n - 1];
int mid = 0;
while (le < ri)
{
mid = (le + ri) >> 1;
int num = 0;
for (int i = 0; i < n; i++)
{
int pos = upper_bound(matrix[i].begin(), matrix[i].end(), mid) - matrix[i].begin();
num += pos;
}
if (num < k)
{
le = mid + 1;
}
else
{
ri = mid;
}
}
return le;
}
};
算法复杂度大概在
O(nlog(n)log(n))
解法二:
class Solution {
public:
int kthSmallest(vector<vector<int>>& matrix, int k) {
int rows=matrix.size();
int cols=matrix[0].size();
vector<int> flag(rows,0);
int minn;
for(int i=0;i<k;++i)
{
int k=0;
while(flag[k]>=cols)++k;
minn=matrix[k][flag[k]];
int change=k;
for(int j=k+1;j<rows;++j)
{
if(flag[j]<cols && matrix[j][flag[j]]<minn)
{
minn=matrix[j][flag[j]];
change=j;
}
}
flag[change]=flag[change]+1;
}
return minn;
}
};
算法复杂度大概
O(kn)