- 原数组为非递减(递增/相等)排序,旋转后仍然部分有序,在其中查找,可使用二分法
- 正常二分法用中值与查找值比较,该题查找最小值,使用中值和左右某端比较,判断最小值在哪个区间
- 判断条件抉择要点:既要符合单段非递减排序的查找最小值,又要符合两段混合查找最小值——选择右端点为基准点
- 右大换右(非递减区间/混合区间),右小换左(混合区间),相等条件下则左移右端点一位
- 优化:右值大于左值则为非递减区间,可直接返回该区间左值
import java.util.ArrayList; public class Solution { public int minNumberInRotateArray(int [] array) { // 以右边为基准点,开始二分查找 int start = 0, end = array.length - 1, mid; while(start < end) { // 已经找到了包含最小值的非递减区间 if(array[start] < array[end]) { return array[start]; } mid = (start + end) / 2; // 右边大则舍弃右边(非递减/混合区间) if(array[end] > array[mid]) { end = mid; // 右边小则舍弃左边(混合区间) } else if(array[end] < array[mid]) { start = mid + 1; // 相等则右边缩小 } else { end--; } } // 存在为0处理 return start == end ? array[start] : 0; } }