Find Minimum in Rotated Sorted Array

(1)假设一个有序数组,经过翻转后,求其最小值?

(2)更进一步,如果该有序数组中包含重复的数,再求其最小值?

对于第(1)问,可以直接对该数组再次排序,求最小值,但是时间复杂度高,至少O(nlogn),而并没有利用有序数组翻转这一条件,继续思考,

对于像有序数组翻转的问题,大部分都用折半的方法去做,可以用于折半查找(即折半后至少有一段是有序的,进而判断target是否在有序段,若在有序段查找,若不在有序段,则在非有序段查找    当然对于有重复的数,仍然要略过),而对于折半去找最小值这个问题,可以看具体例子可知,初始时如果没经过旋转,最小值一定在下标最小处,若经过旋转,下标最小处的值肯定大于下标最大处的值。经过一定的规则更新最小处小标和最大处下标,当下标最小处的值小于下标最大处的值或下标最小处等于下标最大处时,停止迭代,返回下标最小处的值即可。

class Solution {
public:
    int findMin(vector<int>& nums) {
        //二分法来实现,折半查找
        int begin=0;
        int end=nums.size()-1;
        int middle;
        while(begin<end&&nums[begin]>=nums[end])
        {
            middle=begin+(end-begin)/2;
            if(nums[begin]<nums[middle])//此时从begin 到 middle 是有序的,而从begin 到end 非有序,则最小值在  middle+1到 end之间
            {
                begin=middle+1;
            }
            else if(nums[middle]==nums[begin])//这种情况只是在数组中有重复的数时的出现,则忽略这个重复的数 ,往前
            {
                begin++;
            }
            else//同理此时从middle 到 end 是有序的,而从begin 到end 非有序,则最小值在  begin到middle 之间
            {
                end=middle;
            }
        }
        return nums[begin];
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值