[LeetCode] Find Minimum in Rotated Sorted Array 题解

前言

Find Minimum in Rotated Sorted Array这道题存在的价值,大概就是让大家直观感受一下LeetCode上二分的题目真的很多。。。

题目

https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/
Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

Find the minimum element.

You may assume no duplicate exists in the array.

分析

题目意思还是挺直白的,现有一个排好序的数组(升序),假设这个数组中发生了一次“旋转”(rotation),请求出目前最小的那个元素。这里的”rotation”与其理解为“旋转”,不如理解为“轮转”,也就是这个排好序的数组就跟个传送带那样,一部分本来在前面的元素跑到了后面去。此题二分可以直截了当地解出,关键就是理解一下这个“轮转”的情况。

发生了“轮转”,那么此时曾经的最小元素势必不在最前面,头部元素必大于尾部元素。因此,如果发现头元素就比尾元素小,那么必然头元素就是最小的(即没有“轮转”)。我们把最大元素和最小元素之间的界限称为“隔离带”(隔离带中是没有元素的)。然后把整个数组分为左右两侧,考察中间这个元素,如果它大于头元素,说明隔离带在右侧,否则在左侧,重复该操作,二分查找,最终的头元素就势必是原最小元素。

代码

class Solution {
public:
    int findMin(vector<int>& nums) {
      int head = 0, tail = nums.size()-1;
      while (head < tail) {
        if (nums[head] < nums[tail])
          return nums[head];
        int mid = (head + tail) / 2;
        if (nums[mid] >= nums[head]) {
          head = mid + 1;
        } else {
          tail = mid;
        }
      }

      return nums[head];
    }
};

其他

此题的升级版,Find Minimum in Rotated Sorted Array II,更interesting一些,题解在此。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值