在一个旋转数组里,进行二分。但是会有重复的元素。
二分的关键在于判断当前的中点 mid 是在数组旋转点的左边还是右边,当有重复的元素的时候,当nums[mid]==nums[l] && nums[mid]==nums[r]
的时候,是判断不出来的,只能递归了,左边右边都走一下。
class Solution {
public:
bool search(vector<int>& nums, int target) {
if(nums.size()==0)
return false;
return dfs(nums,0,nums.size()-1,target);
}
bool dfs(vector<int>& nums,int l,int r,int target)
{
while(l<r)
{
int mid = (l+r)/2;
if(target == nums[mid])
return true;
if(nums[mid]==nums[r]&&nums[mid]==nums[l])
{
bool res = dfs(nums,l,mid-1,target);
if(res==true)
return true;
res = dfs(nums,mid+1,r,target);
if(res==true)
return true;
return false;
}
if((nums[mid]>nums[r]&&nums[mid]>=nums[l]))
{
if(target<nums[mid])
{
if(target==nums[l])
return true;
else if(target < nums[l])
{
l = mid+1;
continue;
}
else
{
r = mid-1;
continue;
}
}
else
{
l=mid+1;
continue;
}
}
else if((nums[mid]<=nums[r]&&nums[mid]<nums[l]))
{
if(target>nums[mid])
{
if(target==nums[r])
return true;
else if(target > nums[r])
{
r = mid-1;
continue;
}
else
{
l=mid+1;
continue;
}
}
else
{
r = mid-1;
continue;
}
}
else if(nums[mid]<=nums[r]&&nums[mid]>=nums[l])
{
if(target>nums[mid])
{
l=mid+1;
}
else
{
r=mid-1;
}
continue;
}
}
if(target==nums[l])
return true;
return false;
}
};