题目要求

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. OpenCV Canny边缘检测
  2. MySQL中如何查询数据(上)
  3. Oracle创建、删除、备份表
  4. 解决:“确实允许此网页访问剪贴板吗”
  5. CJ20N被删除物料的历史记录
  6. java date eee_java将 Date原始格式EEE MMM dd HH:mm:ss Z yyyy转成指定格式
  7. FastD 最佳实践二: 构建配置中心
  8. 2020年第十届C/C++ B组第二场蓝桥杯省赛真题
  9. 超像素经典 SLIC 算法 python 实现
  10. 数据库课程设计-NBA球队信息管理系统
  11. 安徽公司红蓝军训练营-WriteUpDocker复现
  12. 看看中国科技巨头们在智能音箱行业的竞争
  13. java语言实现视频音频采集_详解js的视频和音频采集
  14. idea 集成Git 遇到的问题 与解决
  15. 8.HTML标签-表格标签table
  16. MATLAB几个误差参数说明
  17. 摩托车头盔防护膜—给你不一样的安全感
  18. mysql vs创建表_MYSQL基础三--表的操作一
  19. Chess Game Dataset (国际象棋游戏数据集)
  20. 软件测试缺陷分析方法简介

热门文章

  1. Android 如何画圆饼图来表示智能机的市场份额
  2. 降采样数字滤波器-MATLAB建模
  3. 利用Shodan和Censys进行信息侦查
  4. 【深度学习】轻量化CNN网络MobileNet系列详解
  5. 数据库关系代数运算----自然连接
  6. 伙伴们休息啦canvas绘图夜空小屋
  7. 重置root用户密码
  8. Delphi xe3 下配置 MAC OS X 编程调试模式
  9. 密码学实验一、凯撒密码
  10. 生活中的几点感想-20210205