378. Kth Smallest Element in a Sorted Matrix

问题:

给定一个二维数组,每一行,每一列,都是升序排列的。

但A[0][1]不一定<A[1][0](右上↗︎元素不一定<左下元素↙︎,但左上↖︎一定<右下↘︎)

求整个二维素组中第K个大的元素值。

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)

最小值l:A[0][0]

最大值r:A[n-1][n-1]

找到第一个小的m,使得count(比m小的数)=k

轮询每行,由于已排序,找到比m小的index=每行count(<m的数)

找到比m小的index -> upper_bound(row, m),找到row数组中第一个>m的数的index。

 

代码参考:

 1 class Solution {
 2 public:
 3     int kthSmallest(vector<vector<int>>& matrix, int k) {
 4         int n = matrix.size();
 5         int l = matrix[0][0], r = matrix[n-1][n-1];
 6         while(l<r) {
 7             int m = l+(r-l)/2;
 8             int cout = 0;
 9             for(auto row:matrix) {
10                 int idx = upper_bound(row.begin(), row.end(), m) - row.begin();
11                 cout += idx;
12             }
13             if(cout >= k) {//find the first m -> cout>=k
14                 r = m;
15             } else {
16                 l = m+1;
17             }
18         }
19         return l;
20     }
21 };

 

posted @ 2020-08-13 13:53  habibah_chang  阅读(85)  评论(0编辑  收藏  举报