算法-11.旋转数组的最小数字
2020-08-11 本文已影响0人
zzq_nene
方式一:直接遍历整个数组,出现后一个比当前位置的数字小的,即后一个就是最小值
/**
* 旋转数组的最小数字
* 所谓旋转数组,即将一个数组最开始的若干个元素搬到数组的末尾
* 比如数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转
* 这就是将原数组的最开始两个元素搬到了数组的末尾
* @param numbers
* @return
*/
public static int minArray1(int[] numbers) {
if (numbers.length == 0) {
return -1;
}
for(int i=0;i<numbers.length-1;i++){
if(numbers[i]>numbers[i+1]) {
return numbers[i+1];
}
}
return numbers[0];
}
方式二:采用二分查找法
/**
* 旋转数组的最小数字
* 所谓旋转数组,即将一个数组最开始的若干个元素搬到数组的末尾
* 比如数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转
* 这就是将原数组的最开始两个元素搬到了数组的末尾
* @param numbers
* @return
*/
public static int minArray(int[] numbers) {
if (numbers.length == 0) {
return 0;
}
int low = 0;
int height = numbers.length - 1;
while (low < height) {
int mid = (height + low) / 2;
if (numbers[mid] == numbers[low] && numbers[mid] == numbers[height]) {
for (int i = low;i<height;i++) {
// 遍历数组,第一次出现下一个比上一个小的情况,那么下一个就是最小值
if (numbers[i] > numbers[i + 1]) {
return numbers[i+1];
}
}
// 如果整个遍历都没有出现下一个比上一个小的情况,那么第一个就是最小值
return numbers[low];
} else if (numbers[height] >= numbers[mid]) {
// 如果最高位置的值大于等于中间位置的,则说明最小值在小于等于mid的部分
height = mid;
} else {
low = mid + 1;
}
}
return numbers[low];
}