二分法进阶:By value 和 By index 的两种二分法

二分法的关键是确定 “搜索空间”,一般分为两种: 索引和值。

以索引为搜索空间: 最简单的例子是在一维排序数组上寻找某个数,我们以[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 时应该选择无论怎样都可以淘汰搜索空间的地方。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章