这里是关键代码
当中间的值大于等于左边的值,就表示是递增的
例如
3 4 5 1 2
此时中间值如果为 5 , 比 3 大,就说明这个中间值是属于左边的,这时候就去右边,因为这个旋转数组,一开始右边的比较大的值,都会往最左边移动,所以当移动完之后,发现中间值是属于左边的,那么就去右边找,因为右边的值还没经过移动。
如果中间值是 2, 比 3 小,说明这个中间值是属于右边的,就去左边寻找,因为数组是有序的,如果去继续往右边找的话,只会找到更大的数。所以向左找。
if(nums[mid] >= nums[left]) // 表示此时的 mid 属于 左边一部分,所以向右边搜寻
left = mid + 1;
else
right = mid - 1;
class Solution {
public:
int findMin(vector<int>& nums) {
//特殊的二分查找
// 只能在旋转的排序数组中使用
int res = nums[0];
int left = 0, right = nums.size() - 1, mid;
while(left <= right) // 左闭右闭区间
{
if(nums[left] < nums[right]) // 代表这是有序的
{
res = min(res, nums[left]); // 在之后也可能会是有有序的,所以这进行了比较
break;
}
mid = (left + right) / 2;
res = min(res, nums[mid]); // 暂时默认中间的为最小值
if(nums[mid] >= nums[left]) // 表示此时的 mid 属于 左边一部分,所以向右边搜寻
left = mid + 1; // 向右边找
else
right = mid - 1; // 向左边找
}
return res;
}
};