• 原数组为非递减(递增/相等)排序,旋转后仍然部分有序,在其中查找,可使用二分法
  • 正常二分法用中值与查找值比较,该题查找最小值,使用中值和左右某端比较,判断最小值在哪个区间
  • 判断条件抉择要点:既要符合单段非递减排序的查找最小值,又要符合两段混合查找最小值——选择右端点为基准点
  • 右大换右(非递减区间/混合区间),右小换左(混合区间),相等条件下则左移右端点一位
  • 优化:右值大于左值则为非递减区间,可直接返回该区间左值
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;
    }
}