题目要求与162题相反,求低谷值
同样的,因为题目给出了边界值(左右边界看做无穷大),所以一定会出现低谷值
- arr[0] < arr[1] :则低谷值就是 arr[0];
- arr[N - 1] < arr[N - 2] :则低谷值就是最后一个元素;
- arr[i - 1] > arr[i] < arr[i + 1] :则低谷值为 arr[i]
特定条件: 对于任意两个相邻位置,都不相等
采用二分的方式
// 局部最小值, 任意一个谷底值位置
public static int localMin(int[] nums) {
if (nums == null || nums.length == 0) return -1;
int N = nums.length;
if (nums.length == 1) return 0;
if (nums[0] < nums[1]) return 0;
if (nums[N - 1] < nums[N - 2]) return N - 1;
int left = 0;
int right = N - 1;
while (left < right) {
int mid = left + (right - left) / 2;
// 如果右边元素大于mid元素,则说明mid可能是谷底值
// 且因为右边大,两端递减区间则为左侧,缩小右边界到mid
if (nums[mid + 1] > nums[mid]) right = mid;
// 否则与上面相反,递减区间在右侧
// 又因为 mid + 1 位置 < mid 位置,则mid+1位置可能是谷底值,缩小左边界到mid+1
else left = mid + 1;
}
return right;
}