找出旋转数组的最小数字,如题所示,与上个一题有些类似 但还是不完全一样,主要是跳出循环判断不一样,需要找到最小的数字,mid每次变的时候也在原位置,并非+-1,否则错过最小值。最后,注意{2,1,2,2,2}这种left,mid,right一样的情况,只能用顺序查找法了,代码如下
public static int search(int[] array) {
int left = 0, right = array.length - 1;
int mid = 0;
if (array[right] > array[left]) {
return array[left];
}
while (left <= right) {
mid = (left + right) / 2;
if (right - left == 1 && mid == left) {
return array[right];
}
// 对于left mid right三者相同的特殊情况们只能用数组查找
if (array[mid] == array[left] && array[left] == array[mid]) {
int result = array[left];
for (int i = left + 1; i <= right; i++) {
if (array[i] < result) {
result = array[i];
}
}
return result;
}
if (array[mid] >= array[left]) {
left = mid;
} else {
right = mid;
}
}
return array[left];
}