再从萌新开始-Leetcode每日题解-153. Find Minimum in Rotated Sorted Array

153Find Minimum in Rotated Sorted Array(Medium

Suppose an array sorted in ascending order 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.


-------------------------------------------------------分割线---------------------------------------


今天挑了次题,第一次pick了道easy,不是很想写,第二次就拿到这道medium。

题设和要求都很简单,一个按照升序排好的数组,但是是循环的,从哪里起始是随机的(感觉描述的不是很清楚,可以参考题目的例子),要求得到数组最小值。且数组中没有重复的元素。


分析:

一个二分查找的变形题,可方法还是一样的,唯一需要更改的就是查找的条件,时间复杂度O(logn)。易得情况可分为以下三种。

1.左边大,右边也大,查找结束;


2.左边小,右边也小,查找结束;


3.左边小,右边大,也即是正常升序,继续查找。


在第3种情况下需要继续查找,查找的方向可以用一下几个条件判断:

1.左边(右边)子序列不满足升序条件,往左边(右边)继续查找;


2.左边和右边都满足升序,说明数组的顺序没有更改过,那直接返回最左边的端点值;


3.左边(右边)到头了,且右边(左边)是满足升序的,比较一下两个端点值,返回小的;


(2,3情况可以合并)

最后再考虑一下特殊情况,比如说只有1/2/3个数的时候,发现之前的都适用。收工收工。

多说一句,图中mid只是一个指针,不代表数组的中间结点。


代码:

class Solution{          
public:      
    int findMin(vector<int>& nums){                           
        int len = nums.size();                                
        int left = 0,right = len-1,mid = (left+right)/2;      
        while (left < right){                                 
            mid = (left + right)/2;                           
            int midNum = nums[mid],leftNum = nums[left],rightNum = nums[right];
            int midPlus = nums[(mid+1)%len], midMinus = nums[(mid-1+len)%len];
            //leftNum  …………  midMinus  midNum  midPlus  …………  rightNum
            
            if (midPlus > midNum && midMinus > midNum) return midNum;
            else if (midPlus < midNum && midMinus < midNum) return midPlus;
            else{        
                if (midPlus > rightNum) left = (mid+1)%len;   
                else if (midMinus < leftNum ) right = (mid-1+len)%len;
                else return leftNum < rightNum?leftNum:rightNum;
            }
  
        }                
        return nums[mid];
    }
};                                                                                    
-------------------------分割线-------------------------------------------------

题解后面再补。写题解的时间比写题的时间多多了…而且感觉写不清楚,有点失落。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值