You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于LeetCode有序矩阵第K小元素二分查找解法的正确性疑问

为什么二分查找解《有序矩阵中第K小元素》能保证最终返回的lo是矩阵中的元素?

这问题问得太到位了!我当初第一次啃这个二分解法的时候,盯着mid可能不是矩阵元素这点纠结了好久,咱们掰开揉碎了说清楚:

首先先快速回顾下这个二分解法的核心逻辑:

  • 搜索空间设为矩阵的最小值(lo)到最大值(hi)
  • 每次取中间值mid,统计矩阵里小于等于mid的元素总数cnt
  • 如果cnt < k:说明第k小的元素肯定比mid大,把lo更新为mid+1
  • 如果cnt >= k:说明第k小的元素在mid左边(包括mid),把hi更新为mid
  • 重复直到lo == hi,返回这个值

关键:为什么最终的lo一定是矩阵里的元素?

咱们从两个角度来理解:

1. 二分的本质是找「满足条件的最小x」

这个解法的核心目标其实是找到最小的x,使得矩阵中<=x的元素个数>=k。而这个最小的x必然是矩阵中的元素:
假设存在一个不在矩阵里的x,满足<=x的元素个数>=k,那一定存在一个比x小的矩阵元素y,使得<=y的元素个数也>=k(因为x和y之间没有矩阵元素,所以<=x和<=y的元素数量是完全一样的)。这就和x是「最小的满足条件的数」矛盾了,所以这个最小的x只能是矩阵里的元素。

2. 边界调整的过程会不断逼近矩阵中的目标元素

初始时lo和hi都是矩阵中的元素(分别是最小、最大值)。每次调整边界时:

  • 当cnt < k,我们把lo设为mid+1:这一步是排除所有<=mid的元素,而第k小的元素肯定在更大的区间里。由于目标元素是矩阵中的某个值,当lo还没到它的时候,每次mid小于目标元素时,cnt都会小于k,lo会持续右移,直到触碰到目标元素。
  • 当cnt >=k,我们把hi设为mid:这一步是缩小到左半区间,直到hi也逼近到目标元素。

举个简单例子直观感受下:
比如矩阵是[[1,2,3],[4,5,6],[7,8,9]],k=5(第5小的元素是5):

  • 初始lo=1,hi=9,mid=5,cnt=5(1-5共5个元素)>=5 → hi=5
  • 接下来lo=1,hi=5,mid=3,cnt=3(1-3共3个)<5 → lo=4
  • 然后lo=4,hi=5,mid=4,cnt=4(1-4共4个)<5 → lo=5
  • 现在lo=hi=5,正好是矩阵中的目标元素

总结

这个二分法看似在搜索一个连续的数值范围,但本质是在筛选矩阵中满足条件的元素,最终收敛的lo一定是矩阵里的那个第k小元素——因为它是满足「<=它的元素个数>=k」的最小值,而这个最小值不可能是矩阵外的数。

内容的提问来源于stack exchange,提问作者Snehasis Ghosh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:47:45