剑指offer-6:旋转数组的最小数字
再次使用了经典的二分思想(y总给跪了)
可以将测试样例泛化数组中的数在二维坐标系中表示,横坐标表示数组下标,纵坐标表示数值,如下所示:
通过二维坐标发现除了最后水平的一段(黑色水平那段)之外,其余部分满足二分性质:竖直虚线左边的数满足 nums[i]≥nums[0];而竖直虚线右边的数不满足这个条件,因此处理思路变得简单些:
1.将最后同nums[0]相同的数字段删除;
2.如果剩下最后一个数nums[i]大于等于第一个数nums[0],则数组整体单调;
3.对删除黑色水平段的数组进行二分遍历。
具体代码如下:
class Solution {
public:
int minNumberInRotateArray(vector<int>& nums) {
int n = nums.size() - 1;
if(n <= 0) return -1;
while(n > 0 && nums[n] == nums[0]) n--;
if(nums[n] >= nums[0]) return nums[0];
int l = 0, r = n;
while(l < r){
int mid = l + r >> 1;
if(nums[mid] < nums[0]) r = mid; //opps
else l = mid + 1;
}
return nums[r];
}
};