1.题目
跟进“搜索旋转排序数组”,假如有重复元素又将如何?
是否会影响运行时间复杂度?
如何影响?
为何会影响?
写出一个函数判断给定的目标值是否出现在数组中。
2.算法
给出[3,4,4,5,7,0,1,2]和target=4,返回 true
public boolean search(int[] a, int target) {
// write your code here
if (a == null || a.length == 0) {
return false;
}
int l = 0;
int r = a.length - 1;
while (l <= r) {
int m = (l + r) / 2;
if (a[m] == target) {
return true;
}
if (a[m] < a[r]) {
if (a[m] < target && a[r] >= target) {
l = m + 1;
} else {
r = m - 1;
}
} else if (a[m] > a[r]) {
if (a[m] > target && a[l] <= target) {
r = m - 1;
} else {
l = m + 1;
}
} else {
r--;
}
}
return false;
}
依靠中间和边缘元素的大小关系,来判断哪一半是不受rotate影响,仍然有序的。而现在因为重复的出现解决的办法只能是对边缘移动一步,直到边缘和中间不在相等或者相遇,这就导致了会有不能切去一半的可能。所以最坏情况(比如全部都是一个元素,或者只有一个元素不同于其他元素,而他就在最后一个)就会出现每次移动一步,总共是n步,算法的时间复杂度变成O(n),记住只能移动和中间元素比较的左边或右边。