当前位置:   article > 正文

LeetCode第378题 有序矩阵中第K小的元素_有序矩阵寻找第k小

有序矩阵寻找第k小

问题:

给你一个nxn矩阵matrix,其中每行和每列元素均按升序排列,找到矩阵中第k小的元素。请注意,它是排序后的第k小的元素,而不是第k个不同的元素。

示例1:

输入:matrix = [[1, 5, 9], [10, 11, 13], [12, 13, 15]], k = 8

输出:13

解释:矩阵中的元素为[1, 5, 9, 10, 11, 12, 13, 13, 15], 第8小元素是13。

提示:

n == matrix.length

n == matrix[i].length

解答:

  1. class Solution {
  2. public:
  3. int kthSmallest(vector<vector<int>>& matrix, int k){
  4. int mArrSize = matrix.size(); //矩阵大小
  5. int left = matrix[0][0]; //矩阵有序排列,第0行第0列即为最小值
  6. int right = matrix[mArrSize-1][mArrSize-1]; //最后一列最后一列即为最大值
  7. int mid = 0;
  8. int count = 0;
  9. while(left < right){
  10. mid = left + (right - left)/2; //left和right的中间值
  11. count = nBcount(matrix, mid); //计算矩阵中小于mid的元素的数量count
  12. if(count < k){ //小于mid的元素数量比k小时,说明目标在mid的右侧
  13. left = mid+1; //将左极限更新为mid
  14. }else {
  15. right = mid; //目标在mid左侧时,将右极限更新为mid
  16. }
  17. }
  18. return right; //最终right=left时退出while循环,right或left即为最终结果
  19. }
  20. private:
  21. int nBcount(vector<vector<int>> & matrix, int n)
  22. {
  23. int row = matrix.size()-1;
  24. int mCol = matrix[0].size();
  25. int col=0;
  26. int count = 0;
  27. while(row>=0 && col<mCol){
  28. if(matrix[row][col]<= n){
  29. count += row + 1;
  30. col++;
  31. }else{
  32. row--;
  33. }
  34. }
  35. return count;
  36. }
  37. };

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

闽ICP备14008679号