LeetCode 81 Search in Rotated So

2016-08-22  本文已影响263人  ShuiLocked

LeetCode 81 Search in Rotated Sorted Array II

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.

看到sorted array就想到binary search,这道题也是binary search的变种,但难点在于array中存在duplicate,需要考虑到会带来新的corner case,反正我是没有想到。。。太弱了。。。一定要弄清楚ascending的判断条件!!!

例子:
若矩阵中没有重复元素,则存在两种情况:
index = 0,1,2,3,4,5,6,7,8,9
array1 = [4,5,6,7,8,9,0,1,2,3]
array2 = [7,8,9,0,1,2,3,4,5,6]

left = 0, right = 9, mid = 4
pivot的位置在右侧时,即0在mid=4右边时,mid=4的左侧递增;
pivot的位置在做左侧时,即0在mid=4左边时,mid=4的右侧递增。

可以根据递增性质判断target是否在左半侧或右半侧,进而选择下一次二分查找的区间。

但当存在重复时,增加一种了新的情况:
index = 0,1,2,3,4,5,6,7,8,9
array1 = [1,1,1,1,1,1,1,1,5,1]
array2 = [1,1,5,1,1,1,1,1,1,1]

此时mid=4时,array[mid]=1,且array[left]=array[right]=1,无法判断哪一侧室递增的。。。

如何解决?
当遇到array[left] = array[mid]时,left++,相对于做一次O(1)的搜索!!!(注意一般情况二分是做了O(lgn)的搜索)。

代码:

bool search(int A[], int n, int key) { 
  int l = 0, r = n - 1; 
  while (l <= r) { 
  int m = l + (r - l)/2; 
  if (A[m] == key) return true; //return m in Search in Rotated Array I 
  if (A[l] < A[m]) { //left half is sorted 
    if (A[l] <= key && key < A[m]) 
      r = m - 1; 
    else 
      l = m + 1; 
  } else if (A[l] > A[m]) { //right half is sorted 
    if (A[m] < key && key <= A[r]) 
      l = m + 1; 
    else 
      r = m - 1; 
  } else 
    l++; 
  } 
  return false;
}

参考
https://discuss.leetcode.com/topic/310/when-there-are-duplicates-the-worst-case-is-o-n-could-we-do-better/3

上一篇下一篇

猜你喜欢

热点阅读