题解 | #旋转数组的最小数字# 【左闭右开】【左闭右闭】

https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba

@[toc]

题目描述

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

解题思路

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

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

两种base case

一个元素(奇数)

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

两个元素(偶数)

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

左闭右开

此时

  • base case => 两个元素
  • 中位位置 => 左中位
    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];
    }
};
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务