今天继续刷leetcode,第81题,查找一个有重复的旋转数组;
分析:
采用二分的方式,较快;
1、对于旋转数组,比较中间的元素和最后的一个元素的大小,如果中间大,那么可能左边有序,如果中间小,那么右边有序;
2、再比较目标在左还是在右;
3、如果相等,那么就让左边的指针左移;
附上c++代码:
class Solution {
public:
bool search(vector<int>& nums, int target) {
if(nums.size()==0)
return false;
int left=0;
int right=nums.size()-1;
while(left<=right)
{
int mid=(left+right)/2;
if(nums[mid]==target)
return true;
else if(nums[mid]<nums[right])
{
if(nums[mid]<target && nums[right]>=target)
left=mid+1;
else
right=mid-1;
}
else if(nums[mid]>nums[right])
{
if(nums[mid]>target && nums[left]<=target)
right=mid-1;
else
left=mid+1;
}
else
right--;
}
return false;
}
};
附上python代码:
class Solution:
def search(self, nums: List[int], target: int) -> bool:
n=len(nums)
if n==0:
return False
left=0
right=n-1
while left<=right:
mid=(left+right)//2
if nums[mid]==target:
return True
elif nums[mid]>nums[right]:
if nums[mid]>target and nums[left]<=target:
right=mid-1
else:
left=mid+1
elif nums[mid]<nums[right]:
if nums[mid]<target and nums[right]>=target:
left=mid+1
else:
right=mid-1
else:
right-=1
return False