题目大意如上所属,要求在O(logn)的时间复杂度解决。
要求时间复杂度为O(logn),首先要想到直接要循环搜索出旋转位置的方法是O(n)以上,所以不可行;
那么根据题目中升序排序数组关键词容易想到,二分搜索来解决。
通过分析可以发现,旋转后的数组由前一段升序和后一段升序组成。那么可以在每次查询过程中,判断当前查询位置是属于前一段还是后一段,这样就转化成常规的二分。
class Solution {
public:
int search(vector<int>& nums, int target) {
int l,r,mid;
int len=nums.size();
l=0,r=len-1;
while(l<=r)
{
mid=l+(r-l)/2;
if(nums[mid]==target)
return mid;
if(nums[mid]>=nums[l])//左侧
{
if(nums[mid]>=target&&target>=nums[l])
r=mid-1;
else
l=mid+1;
}
else if(nums[mid]<=nums[r])//右侧
{
if(nums[mid]<=target&&target<=nums[r])
l=mid+1;
else
r=mid-1;
}
}
return -1;
}
};