题解 | #旋转数组的最小数字#
旋转数组的最小数字
https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
//首先这也是一个有序的数组,有序分为两节
//并且可以知道,最小值,是旋转部分的头
//可以理解为往中间找最小值
//比较:第左边的值还要小;比右边的值还要大
int left = 0;
int right = array.length-1;
while (left < right) {
//mid的值可能等于left
int mid = (left + right) / 2;
if (array[mid] < array[left]) {
//说明最小值在mid前面
right = mid;
} else if (array[mid] > array[right]){
//说明最小值在mid后面
left = mid + 1;
}else{
//大于等于left并且小于等于right
//当存在left==mid,不能移动左指针
//可以移动右指针的原因是,右指针的数字只能大于等于mid
right--;
}
}
return array[left];
}
}
首先要分析,二分法只能用于有序数组。这其实是一个两节的有序数组。比较mid和left,比left小说明在mid前面,比right大,说明在mid后面。然后要注意在此之间的情况,就是移动右指针即可,不要动左指针,因为会存在mid=left的情况,这时候mid要比right小,可以right--
查看17道真题和解析