题目要求

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.Note that it is the kth smallest element in the sorted order, not the kth distinct element.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.

在一个从左到右,从上到下均有序的二维数组中,找到从小到第k个数字,这里需要注意,不要求一定要是唯一的值,即假设存在这样一个序列1,2,2,3,则第三个数字是2而不是3。

思路一:优先队列

当涉及到从一个集合中查找一个元素这样的问题时,我们往往会立刻想到查找的几种方式:有序数组查找,无序数组查找,堆排序。这里如果将二维数组转化为一维有序数组,成本未免太大了。同理,将其中所有元素都转化为堆,也会存在内存不足的问题。因此我们可以采用部分元素堆排序即可。即我们每次只需要可能构成第k个元素的值进行堆排序就可以了。

    public int kthSmallest(int[][] matrix, int k) {//优先队列PriorityQueue<Tuple> queue = new PriorityQueue<Tuple>();//将每一行的第一个元素放入优先队列中for(int i = 0 ; i<matrix.length ; i++) {queue.offer(new Tuple(i, 0, matrix[i][0]));}//对优先队列执行k次取操作,取出来的就是第k个值for(int i = 0 ; i<k-1 ; i++) {Tuple t = queue.poll();//判断是否到达行尾,若没有,则将下一个元素作为潜在的第k个元素加入优先队列中if(t.y == matrix[0].length-1) continue;queue.offer(new Tuple(t.x, t.y+1, matrix[t.x][t.y+1]));}return queue.poll().value;}/*** 存储矩阵中x,y和该下标上对应的值的Tuple*/public static class Tuple implements Comparable<Tuple>{int x;int y;int value;public Tuple(int x, int y, int value) {this.x = x;this.y = y;this.value = value;}@Overridepublic int compareTo(Tuple o) {// TODO Auto-generated method stubreturn this.value - o.value;}}

思路二:二分法查找

二分查找的核心问题在于,如何找到查找的上界和下届。这边我们可以矩阵中的最大值和最小值作为上界和下界。然后不停的与中间值进行比较,判断当前矩阵中小于该中间值的元素有几个,如果数量不足k,就将左指针右移,否则,就将右指针左移。直到左右指针相遇。这里需要注意,不能在数量等于k的时候就返回mid值,因为mid值不一定在矩阵中存在。

    public int kthSmallest2(int[][] matrix, int k){int low = matrix[0][0], high = matrix[matrix.length-1][matrix[0].length-1];while(low <= high) {int mid = low + (high - low) / 2;int count = 0;int i = matrix.length-1 , j = 0;//自矩阵左下角开始计算比mid小的数字的个数while(i>=0 && j < matrix.length){if(matrix[i][j]>mid) i--;else{count+=i+1;j++;}}if(count < k) {low = mid + 1;}else{high = mid - 1;}}return low;}

leetcode378. Kth Smallest Element in a Sorted Matrix相关推荐

  1. leetcode378 Kth Smallest Element in a Sorted Matrix

    思路1: 使用堆. 实现: 1 class Solution 2 { 3 public: 4 int kthSmallest(vector<vector<int>>& ...

  2. Kth Smallest Element in a Sorted Matrix

    类似的题目有: 373. Find K Pairs with Smallest Sums 378. Kth Smallest Element in a Sorted Matrix 668. Kth S ...

  3. 378. Kth Smallest Element in a Sorted Matrix

    文章目录 1题目理解 2 思路分析 2.1二分思路 2.2计算小于等于middle值的个数 3 拓展解决leetcode 668 1题目理解 输入:一个nxn的矩阵,每一行从左到右按照升序排列,每一列 ...

  4. 378. Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Title 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素. 请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ ...

  5. leetcode 378. Kth Smallest Element in a Sorted Matrix

    二分的方法解决 class Solution { public:int kthSmallest(vector<vector<int>>& matrix, int k) ...

  6. leetcode 378. Kth Smallest Element in a Sorted Matrix | 378. 有序矩阵中第 K 小的元素(小根堆)

    题目 https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/ 题解 套了下小根堆模板. class Solutio ...

  7. 利用二分法解决 leetcode 378. Kth Smallest Element in a Sorted Matrix

    问题简述 给定一个 n×nn \times n 的矩阵,矩阵中每行和每列的元素都按升序排列.给定一个 k(k∈[1,n2])k (k \in [1, n^2]), 求再整个矩阵中按从小到大排序为 kk ...

  8. LeetCode 230. Kth Smallest Element in a BST--C++,Python解法--面试真题--找二叉树中第K小的元素

    题目地址:Kth Smallest Element in a BST - LeetCode Given a binary search tree, write a function kthSmalle ...

  9. [LeetCode] Kth Smallest Element in a BST

    Kth Smallest Element in a BST Given a binary search tree, write a function kthSmallest to find the k ...

最新文章

  1. Linux基础:调查和管理进程
  2. Yii2中关于组件的注册以及创建的方法详解
  3. pom.xml文件指定jdk版本号/跳过测试
  4. jar包 和 war包?
  5. python下载微信公众号文章_python如何导出微信公众号文章
  6. python中with open写csv文件_Python中的CSV文件使用with语句的方式详解
  7. 小弟个人学习的过程!!!
  8. c语言结果输出10遍,C语言 如何实现输出这样一系列输出结果
  9. Linux下ar指令与静态库转动态库方法
  10. VMware16安装CentOS7.6虚拟机
  11. 90天吃透阿里P8推荐的625页Java编程兵书pdf,直接入职阿里定级P6
  12. Koo叔说Shader-描边效果
  13. 软件测试速记口诀(一)<软件测试基础>
  14. Masonry自动布局详解五:比例(multipliedBy)
  15. 【Android UI】ListView系列一(基础篇)
  16. 前端js面试题(高级)
  17. 台式机开机黑屏一直闪小横杠,键盘灯鼠标均正常,主板亮
  18. 数学四大思想八大方法_中考数学专题五,四种数学思想方法,第3个比较难掌握...
  19. 【厚积薄发系列】C++项目总结12—函数调用约定导致的崩溃问题分析
  20. 苹果浏览器实战(三)

热门文章

  1. 关于spring以及springIOC,看这一篇就够了,给你总结的清新脱俗
  2. 使用树莓派基于FFmpeg推流视频和摄像头到B站直播间
  3. 最新和平精英画质助手iApp安卓源码+全开源/可用
  4. 2015-06-12
  5. aire 计算机术语,法语计算机及网络词汇(5)
  6. 【笔记】OpenMPI基本使用1
  7. 数据库关系代数运算----自然连接
  8. 智障者失踪3年被发现在服刑 家属疑其系顶罪
  9. java 字符串为空和字符串长度为0的区别?
  10. Extension 扩展