题目:

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

你必须找到一个内存复杂度优于 O(n2) 的解决方案。

示例 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
示例 2:

输入:matrix = [[-5]], k = 1
输出:-5

提示:

  • n == matrix.length
  • n == matrix[i].length
  • 1 <= n <= 300
  • -109 <= matrix[i][j] <= 109
  • 题目数据 保证 matrix 中的所有行和列都按 非递减顺序 排列
  • 1 <= k <= n2

进阶:

  • 你能否用一个恒定的内存(即 O(1) 内存复杂度)来解决这个问题?
  • 你能在 O(n) 的时间复杂度下解决这个问题吗?这个方法对于面试来说可能太超前了,但是你会发现阅读这篇文章( this paper )很有趣。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

【二分查找】

根据题意得知二维矩阵从左向右依次递增,从上到小依次递增,故可得知, matrix[0][0]是最小值, matrix[n-1][n-1]是最大值。所需找的第k小的元素一定在最大值与最小值这个区间中, 现在将题目意思转换为在一个有序范围中查找值,可以考虑使用二分查找。

让 left =  matrix[0][0],right =  matrix[n-1][n-1],计算出mid的值,这样矩阵就会以mid为界限,分为两个部分。一部分元素是小于等于mid的部分,一部分是大于mid的部分。然后就需要判断第k小的元素到底在哪一个部分?(这样就可以明白,在较小的部分中至少应该有k个元素)

找比mid小的元素怎么找:

  • 初始位置在 matrix[n - 1][0](即左下角);
  • 设当前位置为 matrix[i][j],若 matrix[i][j] ≤ mid,则此元素及上方所有元素都是比mid 小的数,计算出这一列比mid小的元素累加到count中,并继续向右移动,否则,matrix[i][j] > mid,就需要向上移动才可能能找到比mid小的元素了;
  • 不断移动直到走出格子为止。

比较count 与 k(二分查找):

  • 循环条件:left < right, mid = left + (right - left) / 2;
  • 如果count >= k,说明小元素部分的范围太大了(count==k时,表示刚好),则需要缩小 小元素的范围,即right = mid;
  • 如果count < k,说明小元素部分的范围太小了,则需要扩大 小元素的范围,即left = mid + 1;
  • 循环结束时:left == right,left或者right即为答案。

java代码:

 1 class Solution {
2 public int kthSmallest(int[][] matrix, int k) {
3 int n = matrix.length;
4 int left = matrix[0][0], right = matrix[n - 1][n - 1];
5 while(left < right){
6 int mid = left + (right - left) / 2;
7 if (check(matrix, mid, k)){
8 //true:count < k
9 left = mid + 1;
10 }else{
11 //flase:count >= k
12 right = mid;
13 }
14 }
15 return left;
16 }
17 public boolean check(int[][] matrix, int mid, int k){
18 int n = matrix.length;
19 int i = n-1, j = 0;
20 int count = 0;
21 while (i >= 0 && j < n){
22 if (matrix[i][j] <= mid){
23 //当前元素小于等于mid,则当前元素及改列上方的元素都小于mid
24 count += i + 1;
25 //继续向右移动
26 j += 1;
27 }else{
28 //否则,向上查找小于mid的元素
29 i -= 1;
30 }
31 }
32 return count < k;
33 }
34 }

 python3代码:

 1 class Solution:
2 def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
3 n = len(matrix)
4 def check(mid):
5 i, j, count = n-1, 0, 0
6 while i >= 0 and j < n:
7 if matrix[i][j] <= mid:
8 count += i + 1
9 j += 1
10 else:
11 i -= 1
12 return count < k
13 left, right = matrix[0][0], matrix[n-1][n-1]
14 while left < right:
15 mid = left + (right - left) // 2
16 if check(mid):
17 left = mid + 1
18 else:
19 right = mid
20 return left

力扣378(java&python)-有序矩阵中第 K 小的元素(中等)的更多相关文章

  1. Java实现 LeetCode 378 有序矩阵中第K小的元素

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

  2. LeetCode 378. 有序矩阵中第K小的元素(Kth Smallest Element in a Sorted Matrix) 13

    378. 有序矩阵中第K小的元素 378. Kth Smallest Element in a Sorted Matrix 题目描述 给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩 ...

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

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  4. Leetcode 378.有序矩阵中第k小的元素

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

  5. [LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

  6. 【力扣】有序矩阵中第K小的元素

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

  7. leetcode.矩阵.378有序矩阵中第K小的元素-Java

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

  8. 【Leetcode 堆、快速选择、Top-K问题 BFPRT】有序矩阵中第K小的元素(378)

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

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

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

  10. [Swift]LeetCode378. 有序矩阵中第K小的元素 | Kth Smallest Element in a Sorted Matrix

    Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth ...

随机推荐

  1. obs 屏幕录像 1. 屏幕放大缩小 2. 圆形摄像头

    obs 屏幕录像 1. 屏幕放大缩小 2. 圆形摄像头 屏幕放大缩小 windows 放大镜 屏幕放大快捷键 win + '+' 是放大屏幕 win + '-' 是缩小屏幕 因为obs不支持缩放功能, ...

  2. 基于DSP的设备振动信号的采集和处理模块研发总结

    前记  在能源领域,由于很多地方都是无人值守,设备故障检测是一个必须面对的问题.笔者通过最近几个行业案例了解到,由于很多设备发生故障时候会产生特定频谱的声音,所以该行业对振动监测的需求特别强烈,由于涉 ...

  3. 【Jmeter】性能测试--EMQ X 压测

    一.业务背景 开发人员需要验证 EMQ X 性能参数,我选用了 Jmeter 进行测试,测试其连接数.发布订阅数据指标 二.测试环境搭建 1. Jmeter 2. Jmeter 插件:需要自行从插件管 ...

  4. codeforce Round 934 div2 个人题解(A~C)

    A. Destroying Bridges 时间限制: 1秒 内存限制: 256兆 输入: 标准输入 输出: 标准输出 有 $n$ 个岛屿,编号为 $1,2,-,n$.最初,每对岛屿都由一座桥连接.因 ...

  5. 记录--Vue2屎山之 Table 屎山

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 Vue2 将在 2023 年年底停止维护了,但是 Vue2 的代码却不会在 2023 年消失,还会越来越多:难以想象几十万行或者几百 ...

  6. 记录--vue刷新当前页面

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 背景 项目当中如果做新增/修改/删除等等操作通常情况下都需要刷新数据或者刷新当前页面. 思路 (1)如果页面简单,调用接口刷新数据即可. ...

  7. PS的流水灯设计分析

    PS的流水灯设计分析 1.实验原理 PS设计流水灯就是采用ARM的硬核实现流水灯设计.ARM内核采用的就是一个可以执行软件程序的平台.这里采用C语言设计.基于前面构建的GPIO外设的硬件平台,这里实现 ...

  8. 【Java面试题】Mybatis

    五.MyBatis 40)谈谈 MyBatis Mybatis 是一个半自动化的 ORM 框架,它对 jdbc 的操作数据库的过程进行封装,使得开发者只需要专注于 SQL 语句本身,而不用去关心注册驱 ...

  9. C#添加自定义控件

    1.vs 控件工具箱添加选项卡 2.输入选项卡名称 我这里是Emgucv 3.点击选择项 4.点击浏览 找到Emgu.CV.Platform.NetFramework.dll 这是emgucv的C#控 ...

  10. #基数排序#CF1654F Minimal String Xoration

    题目传送门 分析 有没有一种办法可以将每个 \(j\) 的比较过程同时进行, 可以发现其实这个过程很像后缀排序,实际上只是加号变成了异或, 从低位到高位重新将字符串排名,用同样的方法做到 \(O(2^ ...