如果不存在重复元素,仅通过判断数组的首尾元素即可判断数组是否连续,但是有重复元素的话就不行了,最坏情况下所有元素都一样,此时只能通过线性扫描确定是否连续。
设对于规模为n的问题的工作量为T(n),则有T(n) = T(n/2) + O(n),根据主定理,可以求得T(n) = O(n)。和之前的O(logn)相比还是退化了不少。
代码:
1 bool monop(int A[], int l, int r) { 2 while (l < r && A[l] <= A[r]) 3 l++; 4 return A[l] <= A[r]; 5 } 6 7 bool search(int A[], int n, int target) { 8 int l = 0; 9 int r = n - 1; 10 11 while (l <= r) { 12 int m = (l + r) / 2; 13 if (A[m] == target) 14 return true; 15 if (monop(A, l, m)) { 16 if (A[l] <= target && target < A[m]) 17 r = m - 1; 18 else 19 l = m + 1; 20 } 21 else { 22 if (target >= A[l] || target < A[m]) 23 r = m - 1; 24 else 25 l = m + 1; 26 } 27 } 28 29 return false; 30 }