题目:寻找旋转排序数组中的最小值

可以将旋转后的数组视为两个并排的上升台阶,前一部分是“高位台阶”,后一部分是“低位台阶”(只有当旋转nums.size()的整数倍时才会出现前低后高的情况)

高位台阶中的每一级都大于低位台阶的最大级,也就是数组的最后一位;因此,如果 nums.back() < nums[mid] 的话,就可以认为最小值一定在 mid 右边;反之,nums[mid] <= nums.back() 的话,最小值就在 mid 左边 或 nums[mid] 自身就是最小值

根据这一特性,只需要比较 x 和 nums[n−1] 的大小关系,就间接地知道了 x 和数组最小值的位置关系,从而不断地缩小数组最小值所在位置的范围,二分找到数组最小值

 1int findMin(vector<int>& nums)
 2{
 3    int left = 0, right = nums.size();
 4    while(left < right)
 5    {
 6        int mid = left + (right - left) / 2;
 7        if(nums[mid] <= nums.back())
 8            right = mid;
 9        else
10            left = mid + 1;
11    }
12    return nums[left];
13}