跳转至

154.寻找旋转排序数组中的最小值 II (Hard)*

题目描述*

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

注意数组中可能存在重复的元素。

示例*

输入: [1,3,5]

输出: 1

输入: [2,2,2,0,1]

输出: 0

代码*

主要区别就是有了重复元素,当边界值相同时无法判断哪一侧是旋转数组,主要有两种处理方法:

  • 如果 nums[mid] == nums[right] 就把最右端丢掉,right-- 1
  • 先做预处理,真正影响结果的是重复数字被分到两段中,因此只要对初始数组头尾去重。
class Solution {
public:
    int findMin(vector<int>& nums) {
        int l = 0, r = nums.size() - 1;
        // 预处理
        while(r > 0 && nums[r] == nums[l]) {
            r--;
        }
        while(l < r) {
            int mid = l + (r - l)/2;
            if(nums[mid] > nums[r]) {
                l = mid + 1;
            }else {
                r = mid;
            }
        }
        return nums[l];
    }
};

  1. 貌似还是预处理快一点 


最后更新: July 23, 2022