题目:
Follow up for "Search in Rotated Sorted Array":
What if duplicates are allowed?
Would this affect the run-time complexity? How and why?
Write a function to determine if a given target is in the array.
思路:
借鉴前一题的思路,同样,先通过比较nums[mid]和nums[left],确定转折点是在左半侧还是右半侧。由于允许重复,所以会出现nums[mid]==nums[left],
这时候不能确定转折点的位置,比如[1,2,1,1,1]和[1,1,1,2,1]
所以这种情况仅作“简单处理”——left++,再重新循环判断。
代码:
public boolean search(int[] nums, int target) {
int left =0,right=nums.length-1;
while(left<=right){
int mid = (left+right)/2;
if(nums[mid]==target)
return true;
if(nums[mid]>nums[left]){//转折点在右侧
if(target<nums[mid]&&target>=nums[left])
right = mid -1;
else
left = mid +1;
}else if(nums[mid]<nums[left]){//转折点在左侧
if(target>nums[mid]&&target<=nums[right])
left = mid +1;
else
right = mid -1;
}else{//nums[mid]==nums[left],此时无法判断转折点的位置,所以仅把left+1
left++;
}
}
return false;
}
leetcode上的解法和上述思路一样,有更详细的注释:
https://leetcode.com/discuss/60618/neat-java-solution-using-binary-search