[LeetCode] 153. Find 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.

Example 1:

Input: [3,4,5,1,2] 
Output: 1

Example 2:

Input: [4,5,6,7,0,1,2]
Output: 0

题目大意:给出一个升序排列的子数列,但是子数列进行了未知的循环移动,例如升序排列的[0,1,2,3,4,5,6,7]经过未知循环移动后变成了[4,5,6,7,0,1,2,3]。找出数列中的最小元素。

方法:
二分法。尽管数列进行了循环移动,但是整体数列还是升序排列的。首先判断数列是否进行了循环位移。判断首尾元素大小。如果首元素较小,说明数列没有位移,数列整体为升序排列,那么首元素既是数列的最小值。
当数列进行了未知的循环位移后:设定一个当前可知的最小值。如果中间元素值比这个最小值小,那么最小值在左区域,将中间值设置为右边界。如果中间元素值比最小值大,说明最小值在右区域,将中间值设置为左边界。循环直至左右边界中间不再存在元素。
代码如下:
class Solution {
public:
    int findMin(vector<int>& nums) {
        if(nums[0]<nums[nums.size()-1])return nums[0];
        int len=nums.size();
        int t=nums[len-1];
        int left=0,right=len-1;
        while(left<right-1){
            int mid=left+(right-left)/2;
            if(nums[mid]>t){
                left=mid;
            }
            else{
                right=mid;
                t=nums[mid];
            }
        }
        return t;
    }
};

从代码可以看出,其实当前的最小值一直都是右边界处的值,所以可以将代码进行简化:

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

emmm其实对于时间和空间都并没有带来什么大的变化。

posted @ 2019-10-31 12:05  程嘿嘿  阅读(107)  评论(0编辑  收藏  举报