题目
代码
方法一
直接莽就完了, 从头遍历到位
但是但是! 这样的时间复杂度是O(n)
如果是大一新生的话这么做确实可以满足…
但你是找一份好工作的呀
class Solution {
public int minArray(int[] numbers) {
int min = numbers[0];
for (int i = 0; i < numbers.length; i++) {
if(numbers[i] < min) {
min = numbers[i];
}
}
return min;
}
}
方法二
所以所以! 我们就应该有第二种方法
上一种方法根本没有利用到旋转数组的特性, 直接莽过去的
因为我们知道旋转数组是有两个范围内是逐渐递增的
所以我们可以使用二分法的方式来对其进行查找 这样的时间复杂度就会只有O(logn)
顺便一提这题真不严谨…说好了是递增数组结果还给我来非递增数组 醉了(
class Solution {
public int minArray(int[] numbers) {
int pivot = 0;
//中轴
int left = 0;
//左边界
int right = numbers.length - 1;
//右边界
while (left < right) {
pivot = (left + right) / 2;
//中轴 = (左边界 + 有边界) / 2;
//注意! 这里其实用pivot = left + (right - left) / 2更好
//可以很好处理int的越界问题
if (numbers[pivot] > numbers[right]) {
//当中轴的数字大于有边界的数字时 左边界是中轴右移一格的位置
left = pivot + 1;
} else if (numbers[pivot] < numbers[right]) {
//当中轴小于右边界的数字时 右边界的值等于中轴
right = pivot;
} else {
//当相等时耿直的右边界往左移一格
//注意! 这里不能左边界右移一格
//因为数组是递增的 递减你就需要右边界左移
right = right - 1;
}
}
return numbers[left];
}
}