题目

类型:二分查找
难度:中等
image.png

解题思路

在二分查找的每一步中,左边界为 low,右边界为 high,区间的中点为 pivot,最小值就在该区间内。
将中轴元素 nums[pivot] 与右边界元素 nums[high] 进行比较,可能会有以下的三种情况:

第一种情况是 nums[pivot]image.png

第二种情况是 nums[pivot]>nums[high]。这说明 nums[pivot] 是最小值左侧的元素,因此可以忽略二分查找区间的左半部分。

image.png

由于数组不包含重复元素,并且只要当前的区间长度不为 1,pivot 就不会与 high 重合;而如果当前的区间长度为 1,这说明已经可以结束二分查找了。因此不会存在nums[pivot]=nums[high] 的情况。当二分查找结束时,就得到了最小值所在的位置。

代码

  1. class Solution {
  2. public int findMin(int[] nums) {
  3. int low = 0;
  4. int high = nums.length - 1;
  5. while (low < high) {
  6. int pivot = low + (high - low) / 2;
  7. if (nums[pivot] < nums[high]) {
  8. high = pivot;
  9. } else {
  10. low = pivot + 1;
  11. }
  12. }
  13. return nums[low];
  14. }
  15. }