剑指offer 11. 旋转数组的最小数字
题目描述
解题思路
排序数组的查找问题首先考虑使用 二分法 解决,其可将 遍历法 的 线性级别 时间复杂度降低至 对数级别 。
画出折线图分析,注意不要太理想(即全是递增),两边可以搞几个大小相等的点(即非递减)。
class Solution {
public int minArray(int[] numbers) {
int n = numbers.length;
int left = 0, right = n - 1; //闭区间
while (left <= right) {
int mid = left + (right - left) / 2;
//1.最小值一定在mid左边(包含mid位置)
if (numbers[mid] < numbers[right]) {
right = mid;
} else if (numbers[mid] > numbers[right]) {
//2.最小值一定在mid左边(不包含mid位置)
left = mid + 1;
} else if (numbers[mid] == numbers[right]) {
//3.最小值不确定,收缩右边界。这样就可以一直收缩右边界,直到遇上第一个比右边界小的元素
right--;
}
}
return numbers[left];
}
}