有一个长度为 n 的非降序数组,比如[1,2,3,4,5],将它进行旋转,即把一个数组最开始的若干个元素搬到数组的末尾,变成一个旋转数组,比如变成了[3,4,5,1,2],或者[4,5,1,2,3]这样的。请问,给定这样一个旋转数组,求数组中的最小值
思路:
虽然经过旋转,但是前后两段都是有序的,所以考虑使用二分法解决。
使middle = (start+end)/2,将middle和end比较:
如果 大于,说明结果在左侧;如果 小于,说明结果在右侧;
如果 等于,无法判断在哪一侧(例如 10111 11101 左右两侧都有可能)需要缩小end继续寻找。
为什么不能使用左侧start和middle比较?
例如 12345 3>1 ,最小值在左侧, 34512 5>3 但是最小值在右侧。无法进行判断。
代码:
public int minNumberInRotateArray(int [] array) {
if(array.length == 0){
return 0;
}
int start = 0;
int end = array.length-1;
while(start < end){
int middle = (start+end)>>>1;
if(array[middle] < array[end]){
end = middle;
}else if(array[middle] > array[end]) {
start = middle + 1;
}else {
end --;
}
}
return array[end];
}
Living without an aim is like sailing without a compass.
—— J. Ruskin