1.暴力法
class Solution {
public:
int search(vector<int>& nums, int target) {
//数组中不存在重复元素
for(int i=0;i<nums.size();i++)
if(nums[i]==target)
return i;
return -1;
}
};
时间复杂度不符合要求
2.二分法
首先可以确定旋转后的数组一定是部分有序的,不是前半部分有序,就是后半部分有序
则先判断哪一部分有序,然后确定target在哪一个区间
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
return search(nums,0,nums.size()-1,target);
}
int search(vector<int> &nums,int left,int right,int target)
{
if(left>right)
return -1;
int mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
if(nums[mid]<nums[right])//右边有序
{
if(nums[mid]<target&&target<=nums[right])//目标值在右
return search(nums,mid+1,right,target);
else
return search(nums,left,mid-1,target);
}
else //左边有序
{
if(nums[left]<=target&&target<nums[mid])
return search(nums,left,mid-1,target);
else
return search(nums,mid+1,right,target);
}
}
};
也可以不使用递归
代码如下:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
if(left>right)
return -1;
while(left<=right)
{
int mid=left+(right-left)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]<nums[right])
{
if(nums[mid]<target&&target<=nums[right])
left=mid+1;
else
right=mid-1;
}
else if(nums[mid]>nums[right])
{
if(nums[left]<=target&&target<nums[mid])
right=mid-1;
else
left=mid+1;
}
}
return -1;
}
};