题目

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

解题思路

和153题的区别在于可能存在重复的元素
当nums[pivot]==nums[high]。由于重复元素的存在,并不能确定 nums[pivot] 究竟在最小值的左侧还是右侧,因此不能莽撞地忽略某一部分的元素。唯一可以知道的是,由于它们的值相同,所以无论 nums[high] 是不是最小值,都有一个它的「替代品」nums[pivot],因此可以忽略二分查找区间的右端点。

image.png

代码

  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 if (nums[pivot] > nums[high]) {
  10. low = pivot + 1;
  11. } else {
  12. high -= 1;
  13. }
  14. }
  15. return nums[low];
  16. }
  17. }