https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/
这道题是我两年多前百度面试的题,当时我还没刷过这道题,想出了二分的思路。人生的第一次面试,第一次面试就过了。
首先找出旋转后的原数组第一个元素的下标,总共有5种情况:
1.位于最左边,左边小于中间,中间小于右边
2.位于左边中间。那么最左边的是大于中间的
3.位于中间,那么最左边的是大于中间的
4.位于右边中间,中间的大于最右边的
5.位于最右边,中间的大于最右边的
然后找出开始位置后。还是按普通的二分搜索来,就是访问数组元素的加上一个增量取余。
class Solution {
public:
int start_point(vector<int>& nums){
int l=0,r=nums.size()-1;
while(l<=r){
int mid=(l+r)/2;
cout<<mid<<endl;
if(nums[mid]<nums[l])
r=mid;
else if(nums[mid]>nums[r])
l=mid+1;
else
return l;
}
return -1;
}
int bi_search(vector<int>& nums,int target,int start_idx){
int n=nums.size();
int l=0,r=nums.size()-1;
while(l<=r){
int mid=(l+r)/2;
if(nums[(mid+start_idx)%n]<target)
l=mid+1;
else if(nums[(mid+start_idx)%n]>target)
r=mid-1;
else
return (mid+start_idx)%n;
}
return -1;
}
int search(vector<int>& nums, int target) {
int start_idx=start_point(nums);
cout<<start_idx<<endl;
return bi_search(nums,target,start_idx);
}
};