153. 寻找旋转排序数组中的最小值

题目描述

153. 寻找旋转排序数组中的最小值

解题思路

  • 如何二分? 确保 结果集只在一个区间中。
    • nums[mid] > nums[left] . ans包含于 left + [mid+1, right)
    • nums[mid] < nums[left] . ans 包含于 [left, mid) + mid
    • nums[mid] > nums[right]. ans 包含于 [mid+1, right)
    • nums[mid] < nums[right]. ans 包含于 [left, mid) + mid
  • 区间选择,区间二分后 取左区间 还是 右区间?

需要注意的是mid始终有可能是最小值。我们在二分过程中,不能排除 Mid是最小值的可能性。

注意点:中位位置是 左中位

两种base case

一个元素(奇数)

例如数组 [3] 。此时mid和right(or right-1)重合,应指向3

两个元素(偶数)

例如数据 [4,3]。此时mid应指向4,right(or right-1)指向3。即mid指向左中位

左闭右开

此时

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        vector<int>& nums = rotateArray;
        int n = nums.size();
        int left=0, right = n;    // init interval [0, n)
        while(left<right) {
            int mid = left+(right-1-left)/2;
            if(nums[mid]<nums[right-1]) {
                right = mid+1;  // 区间shrink to [left, mid+1)。 此处不可排除mid,mid仍有可能是最小值
            } else  if(nums[mid]>nums[right-1]) {
                left = mid+1;   // 区间shrink to [mid+1, right).
            } else  if(nums[mid]==nums[right-1]) {
                right--;        // 区间shrink to [left, right-1)
            }
        }
        return nums[left];
    }
};

左闭右闭

class Solution {
public:
    int minNumberInRotateArray(vector<int> rotateArray) {
        vector<int>& nums = rotateArray;
        int n = nums.size();
        int left=0, right = n-1;  // init interval [0, n-1]
        while(left<right-1) {
            int mid = left+(right-left)/2;
            if(nums[mid]<nums[right]) {
                right = mid;    // interval shrink to [left, mid]. mid is possible to be the least. 
            } else  if(nums[mid]>nums[right]) {
                left = mid+1;   //  interval shrink to [mid+1, right]
            } else  if(nums[mid]==nums[right]) {
                right--;        // interval shrink to  [left, right-1]
            }
        }
        return nums[left];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值