找到二分的条件,很简单
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int left = 0, right = nums.size()-1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]>=nums[0]) left = mid+1;
else right = mid-1;
}
return left<nums.size()?nums[left]:nums[0];
}
};
class Solution {
public:
int findMin(vector<int>& nums) {
if(nums.size()==1) return nums[0];
int end = nums.size()-1;
while(end>=0&&nums[0]==nums[end]) end--;
if(end==0) return nums[0];
int left = 0, right = end;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]>=nums[0]) left = mid+1;
else right = mid-1;
}
return left<nums.size()?nums[left]:nums[0];
}
};
找到分界点,做两次二分
class Solution {
public:
int search(vector<int>& nums, int target) {
int n = nums.size();
if(n==0) return -1;
if(n==1) return nums[0]==target?0:-1;
if(nums[n-1]>nums[0]) return search(nums,0,n-1,target);
int left = 0, right = nums.size()-1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]>=nums[0]) left = mid+1;
else right = mid-1;
}
if(target==nums[left]) return left;
else if(target>=nums[0]) return search(nums,0,left-1,target);
else return search(nums,left,n-1,target);
}
int search(vector<int>& nums, int left, int right, int target){
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]==target) return mid;
else if(nums[mid]>target) right = mid-1;
else left = mid+1;
}
return -1;
}
};
class Solution {
public:
bool search(vector<int>& nums, int target) {
if(nums.size()==0) return false;
if(nums.size()==1) return nums[0]==target;
int end = nums.size()-1;
while(end>=0&&nums[0]==nums[end]) end--;
if(end<=0) return nums[0]==target;
if(nums[0]<nums[end]) return search(nums,0,end,target);
int left = 0, right = end;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]>=nums[0]) left = mid+1;
else right = mid-1;
}
if(target>=nums[0]) return search(nums,0,left-1,target);
else return search(nums,left,end,target);
}
bool search(vector<int>& nums, int left, int right, int target){
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]==target) return true;
else if(nums[mid]>target) right = mid-1;
else left = mid+1;
}
return false;
}
};