LC.378. 有序矩陣中第K小的元

LC.378. 有序矩陣中第K小的元素

傳送門

思路:

1.對所有元素排序,時間複雜度:O(n2logn2)O(n^2logn^2)

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.根據矩陣圖形的性質可知,小於等於某一個數的圖形在矩陣左上方,大於該數的部分在右下方,且左上角數最小,右下角數最大,因此考慮二分答案,從a[n1][0]a[n-1][0]開始走,如果當前位置滿足則cnt+=(i+1),cnt+=(i+1),該列滿足條件的元素個數,否則j++j++,列數+1,直到走出矩陣。 時間複雜度:O(nlog(rl))O(nlog(r-l))

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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章