zoukankan      html  css  js  c++  java
  • [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其实对于时间和空间都并没有带来什么大的变化。

  • 相关阅读:
    Assetbundle资源单一打包,以及加载方法
    VS2010 Chromium编译
    一道思考题
    Windbg源码调试
    C++ static_cast dynamic_cast reinterpret_cast const_cast转换
    条件断点设置
    FFmpeg 2.0编译配置
    error LNK2001: 无法解析的外部符号 _IID_IDirectDraw7
    Windbg常用命令
    DDraw绘图
  • 原文地址:https://www.cnblogs.com/cff2121/p/11770461.html
Copyright © 2011-2022 走看看