Array Binary Search
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]). Find the minimum element. The array may contain duplicates. Example 1: Input: [1,3,5]
Output: 1
Example 2:
Input: [2,2,2,0,1]
Output: 0
相似的题目
Find Minimum in Rotated Sorted Array 中等
- 初始化下标 left 和 right
- 每次计算中间下标 mid = (right + left) / 2,这里的除法是取整运算,不能出现小数
- 当 numbers[mid] < numbers[right] 时,说明中点落在数组的前半部分,说明最小值在 [left, mid] 区间中,则令 right = mid,用于下一轮计算
- 当 numbers[mid] > numbers[right] 时,说明中点落在数组的前后部分,说明最小值在 [mid, right] 区间中,则令 left = mid + 1,用于下一轮计算
- 当 numbers[mid] == numbers[right] 时,无法判断最小值在哪个区间之中,此时让 right—,缩小区间范围,在下一轮进行判断
- 为什么是 right— 缩小范围,而不是 left++?
- 因为数组是升序的,所以最小值一定靠近左侧,而不是右侧
- 比如,当存在 [1,2,2,2,2] 这种情况时,left = 0,right = 4,mid = 2,数值满足 numbers[mid] == numbers[right] 这个条件,如果 left++,则找不到最小值
class Solution {
public int findMin(int[] nums) {
int left = 0;
int right = nums.length - 1;
while (left <= right) { // 二分法中<=,<无所谓,最后返回时随机应变
int mid = left + (right - left) / 2;
if (nums[mid] < nums[right]) {
right = mid; // 该情况下mid可能是结果,所以不是mid-1
} else if (nums[mid] > nums[right]) {
left = mid + 1;
} else if (nums[mid] == nums[right]) {
right --;
}
}
return nums[left]; //因为只有right指针会有不安全的移动行为,所以返回时选择left
}
}