二分法的关键是确定 “搜索空间”,一般分为两种: 索引和值。
以索引为搜索空间: 最简单的例子是在一维排序数组上寻找某个数,我们以[0, n]为搜索空间,不断减少该空间。
以值为搜索空间: 即我们可以从 [min, max] 的范围寻找某个数,一般适用于没在一个方向上排序的问题,像leetcode 378和leetcode410。
为了节约篇幅,本文认为读者已经知道如何在排序的矩阵中用二分法找到某个数。
定义两个函数:
+ count() : 寻找 matrix 中小于等于 target 的元素个数。 时间复杂度: O(logn), n为 matrix 元素个数
+ countSmaller() : 同上,只不过是寻找小于target 元素的个数。
By Value 的二分法:
min 是 matrix[0][0], max 是 matrix[n][n],每次取区间的中值,根据count() 判断是往左还是往右。很多题解已经说过,不在赘述。
By Index 的二分法:
二分法本质是利用单调性淘汰多余的「搜索空间」,所以在选择 index 时应该选择无论怎样都可以淘汰搜索空间的地方。