【LeetCode-每日一题】-378. 有序矩阵中第K小的元素

简介: 【LeetCode-每日一题】-378. 有序矩阵中第K小的元素

1. 题目描述

2. 题目分析

  1. 这个题目类似于【剑指offer】-二维数组的查找-01/67
  2. 在此题的基础上进行一些扩展,题目要求我们找到矩阵中第K小的元素,也就是在1~15的范围中,找到第K小的数字。
  3. 我们对1~15进行二分,用mid来判断当前矩阵中小于等于mid的的有多少(count),如果count小于K的话,也就是在证明当前的元素过于小,所以,需要left = mid + 1;如果count大于等于K的话,也就是证明当前的元素过于大或者正好,所以,需要right = mid。
  4. 这里比较困惑的一点是,怎么证明最后返回的left一定在数组内,咱们可以这样想,首先对于第K小的元素,比如13,我们用二分找到的count只要是大于等于K的,肯定是大于等于13的,然后我们缩小mid的值,直到最后left == right,也就是最左边的边界(13),也可以理解成,在矩阵中,只有13,14是等于K的,我们需要找他最左边的值。

3. 题目代码

public int kthSmallest(int[][] matrix, int k) {
    int n = matrix.length;
    int left = matrix[0][0];
    int right = matrix[n - 1][n - 1];
    while (left < right) {
      int mid = (left + right) / 2;
      int i = n - 1;
      int j = 0;
      int num = 0;
      while (i >= 0 && j < n) {
        if (matrix[i][j] <= mid) {
          num += i + 1;
          j++;
        } else {
          i--;
        }
      }
      if (num >= k) { // 当前的数字 大于的过多 需要减少
        right = mid;
      } else {
        left = mid + 1;
      }
    }
    return left;
  }


相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
36 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
50 0
Leetcode第21题(合并两个有序链表)
|
1月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
33 0
|
3月前
|
存储 算法 NoSQL
LeetCode第73题矩阵置零
文章介绍了LeetCode第73题"矩阵置零"的解法,通过使用矩阵的第一行和第一列作为标记来记录哪些行或列需要置零,从而在不增加额外空间的情况下解决问题。
LeetCode第73题矩阵置零
|
1月前
|
算法 C++
Leetcode第59题(螺旋矩阵2)
这篇文章介绍了解决LeetCode第59题“螺旋矩阵II”的算法,通过C++编程实现按顺时针顺序填充一个n x n的正方形矩阵。
17 0
|
1月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
30 0
|
1月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
32 0
|
3月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
3月前
|
算法 索引
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
这篇文章介绍了LeetCode第34题"在排序数组中查找元素的第一个和最后一个位置"的解题方法,通过使用双指针法从数组两端向中间同时查找目标值,有效地找到了目标值的首次和最后一次出现的索引位置。
LeetCode第34题在排序数组中查找元素的第一个和最后一个位置
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行