①暴力解法
class Solution {
public int minArray(int[] numbers) {
int min=numbers[0];
int n=numbers.length;
for(int i=1;i<n;i++){
if(numbers[i]<min){
min=numbers[i];
if(numbers[i]<numbers[i-1]){
break;
}
}
}
return min;
}
}
旋转数组性质:
②二分算法
class Solution {
public int minArray(int[] numbers) {
int len = numbers.length;
if (len == 0) {
return 0;
}
int left = 0;
int right = len - 1;
while (left < right) {
int mid = (left + right) >>> 1;
if (numbers[mid] > numbers[right]) {
// [3, 4, 5, 1, 2],mid 以及 mid 的左边一定不是最小数字
// 下一轮搜索区间是 [mid + 1, right]
left = mid + 1;
} else if (numbers[mid] == numbers[right]) {
// 只能把 right 排除掉,下一轮搜索区间是 [left, right - 1]
right = right - 1;
} else {
// 此时 numbers[mid] < numbers[right]
// mid 的右边一定不是最小数字,mid 有可能是,下一轮搜索区间是 [left, mid]
right = mid;
}
}
//最小数字一定在数组中,因此不用后处理
return numbers[left];
}
}