LC.378. 有序矩陣中第K小的元素
思路:
1.對所有元素排序,時間複雜度:
class Solution {
public:
int kthSmallest(vector<vector<int>>& a, int k) {
int cnt=0;
vector<int>b;
for(int i=0;i<a.size();i++)
for(int j=0;j<a.size();j++)
b.push_back(a[i][j]);
sort(b.begin(),b.end());
return b[k-1];
}
};
2.根據矩陣圖形的性質可知,小於等於某一個數的圖形在矩陣左上方,大於該數的部分在右下方,且左上角數最小,右下角數最大,因此考慮二分答案,從開始走,如果當前位置滿足則該列滿足條件的元素個數,否則,列數+1,直到走出矩陣。 時間複雜度:
class Solution {
public:
bool check(vector<vector<int>>& a,int mid,int k,int n){
int i=n-1,j=0,cnt=0;
while(i>=0&&j<n){
if(a[i][j]<=mid){
cnt+=i+1;
j++;
}
else i--;
}
return cnt>=k;
}
int kthSmallest(vector<vector<int>>& a, int k) {
int n=a.size(),l=a[0][0],r=a[n-1][n-1];
while(l<r){
int mid=l+((r-l)>>1);
if(check(a,mid,k,n)) r=mid;
else l=mid+1;
}
return l;
}
};