Leetcode - 154. 寻找旋转排序数组中的最小值 II
解题思路参考代码中的注释:
class Solution {
// 本题和第81题(https://leetcode-cn.com/problems/search-in-rotated-sorted-array-ii/)类似
public int findMin(int[] nums) {
// 搜索区间[left, right]
int left = 0, right = nums.length - 1;
while (left < right) {
// 数组中可能有重复元素,而左端点和右端点相同会影响判断
// 因此此时将右指针左移一位,然后进行下一轮循环
// 本题和上一题的唯一差别就是多了这一段代码
if (nums[left] == nums[right]) {
right--;
continue;
}
int mid = (left + right) >> 1;
// 如果中间点大于等于左端点,说明[left, mid]是有序的
if (nums[mid] >= nums[left]) {
// 由于[left, mid]是有序的,因此nums[left]是该区间上的最小值
// 那么只要nums[left] < nums[right],就可以断定nums[left]是[left, right]区间上的最小元素
if (nums[left] < nums[right]) {
return nums[left];
}
// 否则继续二分搜索
left = mid + 1;
// 如果中间点小于左端点,说明[mid, right]是有序的
} else {
if (nums[mid] < nums[mid - 1]) {
return nums[mid];
}
right = mid - 1;
}
}
return nums[left];
}
}