个人思路总结:
其实此题如果用暴力法非常简单,遍历一遍即可,时间复杂度为O(n)。但是题目要求时间复杂度必须是 O(log n) 级别。因此我选择采用二分+递归来实现。
但是由于是旋转数组,因此需要对二分做一点改动:将数组一分为二,其中一定有一个是有序的,另一个可能是有序,也能是部分有序。此时有序部分用二分法查找。无序部分再一分为二,其中一个一定有序,另一个可能有序,可能无序。就这样循环
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int len = nums.size();
return search_partial(nums,0,len-1,target);
}
int search_partial(vector<int>& nums, int i, int j, int target)
{
int mid = (i+j)/2;
if(i>j)
return -1;
if(nums[mid]==target)
return mid;
if(nums[mid]<nums[j])
{//此时右边数组有序
if(nums[mid]<target && target<=nums[j])
//判断target是否在右边数组范围
return search_partial(nums,mid+1,j,target);
else
return search_partial(nums,i,mid-1,target);
}
else
{//此时左边数组有序
if(nums[mid]>target && target>=nums[i])
//判断target是否在左边数组范围
return search_partial(nums,i,mid-1,target);
else
return search_partial(nums,mid+1,j,target);
}
}
};