题目描述
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.
在 Search in Rotated Sorted Array题目的基础上增加一个条件,数组中有重复元素。解题思路
允许重复元素,则上一题中如果 A[middle]>=A[start], 那么 [start,middle] 为递增序列的假设就不能成立了,比如 [8,8,5,8,8,8,8,9,10,11,12,13,14],如果按Search in Rotated Sorted Array中方法,则元素5根据
A[start] < A[middle] && target < A[start]的判定条件将会出现在数组后半段中,而实际上它是在前半段中的:
如果 A[middle]>=A[start] 不能确定递增,那就把它拆分成两个条件:
- 若 A[middle]>A[start],则区间 [start,middle] 一定递增;
- 若 A[middle]==A[start] 确定不了,那就 start++。
代码
public static boolean search(int[] A, int target) {
int start = 0, end = A.length - 1;
int middle;
// 当数组为空时返回-1
if (A.length == 0) {
return false;
}
while (start <= end) {
middle = (start + end) / 2;
if (A[middle] == target) {
// 相等则返回
return true;
}
if (A[start] < A[middle]) {
if (target >= A[start] && target < A[middle]) {
// target在前半段
end = middle;
} else {
// target在后半段
start = middle + 1;
}
} else if (A[start] > A[middle]) {
if (target >= A[middle] && target <= A[end]) {
// target在后半段
start = middle + 1;
} else {
// target在前半段
end = middle;
}
} else {
//跳过重复元素
start++;
}
}
return false;
}