【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;
  }


相关文章
|
7天前
题目----力扣--合并两个有序链表
题目----力扣--合并两个有序链表
11 0
|
7天前
题目----力扣--移除链表元素
题目----力扣--移除链表元素
14 1
|
8天前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
19 1
|
8天前
|
索引
【力扣刷题】回文链表、环形链表、合并两个有序链表
【力扣刷题】回文链表、环形链表、合并两个有序链表
15 0
|
13天前
|
算法 C语言
Leetcode_203.移除链表元素—C语言
Leetcode_203.移除链表元素—C语言
|
14天前
|
人工智能
力扣100114. 元素和最小的山形三元组 II(中等)
力扣100114. 元素和最小的山形三元组 II(中等)
|
19天前
|
存储
力扣 合并两个有序数列||移除元素
力扣 合并两个有序数列||移除元素
18 0
|
20天前
leetcode代码记录(下一个更大元素 II
leetcode代码记录(下一个更大元素 II
11 0
|
8天前
|
索引
【力扣刷题】两数求和、移动零、相交链表、反转链表
【力扣刷题】两数求和、移动零、相交链表、反转链表
16 2
【力扣刷题】两数求和、移动零、相交链表、反转链表
|
8天前
|
算法
"刷题记录:哈希表+双指针 | leetcode-2465. 不同的平均值数目 "
该文段是一篇关于编程题目的解答,主要讨论如何找到数组中所有不同平均值的个数。作者首先使用排序和哈希集来解决,将数组转为列表排序后,通过双指针计算平均值并存入哈希集以去重。然后,作者发现可以优化方案,通过双指针在排序后的数组中直接计算两数之和,用哈希集记录不重复的和,从而避免实际计算平均值,提高了算法效率。最终代码展示了这两种方法。
15 0