寻找旋转排序数组最小值
关键词:二分搜索
//升序的话做旋转数组,划一刀两边至少一边有序
//左边有序,排列为k…mid…max 0 …k-1,
//右边有序,排序为k …max 0 … mid … k-1 (注意mid = 0)
//注意left可能=mid,right一定>mid,为避免=时的情况考虑是否漏掉mid,改用right判断
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0,right = nums.size()-1;
while(left < right){
int mid = left + ((right-left)>>1);
if (nums[right] > nums[mid]){
right = mid;
}
else{
left = mid + 1;
}
}
return nums[left];
}
};
整不明白非要用left的话自己写就知道容易出错了
用left的话可以加个res保留结果
class Solution {
public:
int findMin(vector<int>& nums) {
int left = 0,right = nums.size()-1;
int res = nums[0];
while(left <= right){
int mid = left + ((right-left)>>1);
res = min(res,nums[mid]);//比较中间值
if (nums[left]<=nums[mid]){//左边有序
res = min(res,nums[left]);//直接得到左边最小值
left = mid+1;//搜索右边
}
else{
res = min(res,nums[mid+1]);//直接得到右边最小值
right = mid - 1;//搜索左边
}
}
return res;
}
};