这道题目类型不少,一般情况下是能写出来的。但写的复杂,时间长。
切入点要放在中间元素和端点元素的比较上,并依此进行情况的分类。
传统的二分主要是比较中间元素,然后决定前进的方向。这里相当于多了一层判断。
1.先判断已排序的部分,2,在确定前进的方向,3,所谓前进就是left和right的值的更新。
最坏的情况下对退化为线性。
简洁的代码:https://oj.leetcode.com/discuss/223/when-there-are-duplicates-the-worst-case-is-could-we-do-better
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;
}