对于一个有序数组:
int[] arr = { 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4};
如果我们想要找3的任意位置,那二分法直到找到3,马上停止即可。
如果我们要找到最左侧3的位置,那二分法要二分到最后leftIndex = rightIndex才能停止。
对于一个无序数组:
需求:找到任意一个局部最小值的下标
步骤:
- 先判断首尾是否是局部最小值,如果是直接返回;否则说明中间一定存在最小值;
- 取中间索引m,如果arr[m]是局部最小值,直接返回;如果arr[m]比arr[m-1]大,则直接取m = (m+leftIndex)//2 继续步骤2;如果arr[m]比arr[m+1]大,则直接取m = (m+rightIndex)//2 继续步骤2