一、前言
错过上一篇的小伙伴们,可以先阅读前端工程师的 LeetCode 之旅 – 二分搜索算法 Easy 篇,了解一下二分搜索算法的实现原理以及如何利用 JavaScript 语言实现该算法。
二分搜索算法本身并不是特别复杂,核心点主要集中在:
- 有序数组:指的是一个递增或者递减的区间(特殊情况如:【852. 山脉数组的峰顶索引】);
- 中间数:用来确定搜索目标落在左半区间还是右半区间;
进入 Medium 难度之后,这两个条件一般不会直接给出,需要解题者根据题目自行构造。
二、LeetCode 实战
1、378. 有序矩阵中第K小的元素
由水平和垂直方向为递增数组的条件,可以得到当前二维空间中的左上角为最小值,右下角为最大值,所以有序数组即为最小值到最大值的整数递增序列。
题目要求计算出第 k 小的元素,那么从有序数组中挑选出来的中间数并不能直接与 k 进行比较,需要在二维空间中找出当前中间数是第几小的数字,再与 k 进行比较:
- 如果当前中间数比第 k 小的元素要大,那么第 k 小元素必然在左半区间;
- 否则必然落在右半区间;
通过当前二维数组水平和垂直方向单调递增的特性,可以从