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; } }