题解
有点变化的二分查找。注意这题的test case中有不变的,即数组可能rotate也可能不。
思路也是差不多的,设有left right mid 三个index。
注意mid可能有三种情况,1和2只能这么写才能…
- nums[mid] > nums[right]
- nums[mid] < nums[left]
- normal
目的就是想办法将这个rotate数组分割成正常的升序数组,以便二分。
Code
class Solution {
public:
int search(vector<int>& nums, int target) {
int n=nums.size();
int l=0,r=n-1,m;
while( l<=r ){
m=(l+r)/2;
if(nums[m]==target) return m;
if( nums[m]>nums[r]){
if(target<nums[m]&&target>=nums[l])// 分割
r=m-1;
else
l=m+1;
}
else if(nums[m]<nums[l]){
if(target>nums[m]&&target<=nums[r])// 分割
l=m+1;
else
r=m-1;
}
else{ // 正常二分
if(target>nums[m])
l=m+1;
else
r=m-1;
}
}
return -1;
}
};