【题解】
会发现旋转之后,假设旋转点是i
则0..i-1是递增有序的。然后i..len-1也是递增有序的。
且nums[i..len-1]<nums[0].
而nums[1..i-1]>nums[0]
所以我们可以把数组分成两段了。
怎么判断我们二分中点的时候是处在哪一段中的呢?
当然就是让nums[mid]和nums[0]比较一下啦~
情况比较多 我在代码里都交代清楚了
【代码】
class Solution {
public:
int search(vector<int>& nums, int target) {
int l,r;
l = 0;r = ((int)nums.size()) - 1;
while (l<=r){
int mid = (l+r)/2;
if (nums[mid]>=nums[0]){
//取的中间点在左边这一段。
if (target>=nums[0]){
//目标也在左边这一段,那就根据和它的大小比.
if(target<nums[mid]){
r = mid-1;
}else{
l = mid+1;
}
}else{
//目标不在左边这一段(即在右边那一段)
l = mid + 1;
}
}else{
//取的中间点在右边这一段
if (target>=nums[0]){
//目标在左边那一段
r = mid-1;
}else{//在右边那一段
if (target<nums[mid]){
r = mid-1;
}else{
l = mid+1;
}
}
}
}
if (l-1>=0 && target==nums[l-1]){
return l-1;
}else return -1;
}
};
原文:https://www.cnblogs.com/AWCXV/p/11846663.html