当前位置:   article > 正文

LeetCode 378. 有序矩阵中第K小的元素

LeetCode 378. 有序矩阵中第K小的元素

原题目:https://leetcode-cn.com/problems/kth-smallest-element-in-a-sorted-matrix/

 

思路一:

使用大顶堆,找出前k小。

 

代码:

  1. class Solution {
  2. public:
  3. int kthSmallest(vector<vector<int>>& matrix, int k) {
  4. priority_queue<int> q;
  5. int n = matrix.size();
  6. for(int i=0;i<n;i++){
  7. for(int j=0;j<n;j++){
  8. q.push(matrix[i][j]);
  9. while(q.size()>k){
  10. q.pop();
  11. }
  12. }
  13. }
  14. return q.top();
  15. }
  16. };

 

思路二:

二分查找,找出小于mid的数目,如果此数目大于等于k,那么就在小于mid的数里面继续找,否则在大于 mid的数里面继续寻找。

数目怎么查找?我们可以分析发现,因为每行每列都是升序的,所以小于mid的数一定位于其左上角,则如下图所示(来源于leetcode):

 

  1. class Solution {
  2. public:
  3. int count(vector<vector<int>>& matrix, int n ,int c){
  4. int num = 0;
  5. int i = n-1,j=0;
  6. while(i>=0 && j<n){
  7. if(matrix[i][j]<=c){
  8. num += i+1;
  9. j++;
  10. }
  11. else{
  12. i--;
  13. }
  14. }
  15. return num;
  16. }
  17. int kthSmallest(vector<vector<int>>& matrix, int k) {
  18. int n = matrix.size();
  19. int left = matrix[0][0];
  20. int right = matrix[n-1][n-1];
  21. while(left<=right){
  22. int mid = left + (right - left) / 2;
  23. if(count(matrix,n,mid) >= k) right = mid - 1;
  24. else left = mid + 1;
  25. }
  26. return left;
  27. }
  28. };

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/982684
推荐阅读
相关标签
  

闽ICP备14008679号