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.
昨天的题目数组中没有重复元素,因而当l!=m!=r时,就有A[l]!=A[m]!=A[r],则A[m]与边缘元素一般不会出现相等的情况,再根据A[m]与边缘元素的大小关系,推断出左右两半哪个是有序的。通过这个O(1)的判断能够淘汰一般的数据,从而实现二分的O(logn)的时间复杂度。但是当数组中允许重复元素时,若出现A[m]等于边缘元素的情况,此时就无法判断哪个部分是有序的了,此时需要移动边缘元素到不重复为止。此时就无法达到二分每次都能淘汰一半的情况了,故最坏复杂度为O(n)//基本的思路仍然是取A[middle]跟边缘值比较,来推测逆序点pivot的位置
public class Solution {
public boolean search(int[] nums, int target) {
boolean result = false;
int left = 0;
int right = nums.length - 1;
while(left <= right){
int middle = (left+right) / 2;
if(nums[middle] == target){
result = true;
break;
}
if(nums[middle] > nums[left]){ //说明pivot不位于左侧,左半有序
if(nums[left]<=target && target<nums[middle]){ //target位于左半
right = middle - 1;
}else{ //target不位于左半
left = middle + 1;
}
}else if(nums[middle] < nums[left]){ //说明pivot位于左侧,那么右半有序
if(nums[middle]<target && target<=nums[right]){ //target位于右半
left = middle + 1;
}else{ //target不位于右半
right = middle - 1;
}
}else{ //nums[m]=nums[l],无法判断pivot的位置,且left不是target
left++; //移动边缘的位置
}
}
return result;
}
}