Leetcode: Find Minimum in Rotated Sorted Array

原题链接:https://leetcode.com/problems/find-minimum-in-rotated-sorted-array/

我在github上的leetcode仓库:https://github.com/cooljacket/leetcodes

题意

定义翻转有序数组:一个升序数组,从中间某个元素切开,把左右两部分互换位置。
比如[1, 2, 3, 4, 5, 6, 7]从3处切开成为[1, 2, 3]和[4, 5, 6, 7],两部分互换位置,变成[4, 5, 6, 7, 1, 2, 3]。

给定这样一个数组,要求找出其中最小的元素出来!

这一题的要求比较简单,输入没有重复的元素;
有重复元素的版本见:http://blog.csdn.net/Jacketinsysu/article/details/52299291

思路

这样的数组的特征是很明显的,就是如下图所示的趋势:

细节1

用二分查找的思路很直接,需要确定的细节就是:如何移动左右端?

用low,high和mid分别表示左端、右端和区间中点。
如果mid是落在A区的话,很明显有nums[mid] > nums[high],反之亦然。
若mid是落在B区的,则有nums[mid] < nums[high],反之亦然。

当mid落在A区时,很明显可以low = mid + 1;
当mid落在B区时,只能high = mid。为什么不能mid - 1呢?因为如此时mid刚好指向的是最小值,-1就过头了!

细节2

其实还有一个细节,就是mid的计算,它有两个方法:
1)mid = (low + high) >> 1;
2)mid = (low + high + 1) >> 1;
这两种计算方法具体会产生什么不同的效果呢?

其实有经验的人就会知道,二分查找过程中,最最关键的地方,就是收敛到最后只剩下两个元素的时候,怎么取舍,决定了mid要偏左还是偏右!(这里说得有点悬,改天再写一篇二分查找的专题)

这里举个简单的例子就好了,比如最后的区间是这样的:[1, 0],然后如果用的是第二种计算mid的方法,就会死循环了,因为mid一直会等于high!而high在比较过后又会变成mid,一直不变!

代码

没有重复的元素,代码很简单:

class Solution {
public:
    int findMin(vector<int>& nums) {
        int low = 0, high = nums.size() - 1, mid;
        while (low < high) {
            mid = (low + high) >> 1;
            if (nums[mid] > nums[high])
                low = mid + 1;
            else
                high = mid;
        }
        return nums[low];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值