zoukankan      html  css  js  c++  java
  • Leetcode每日一题 153. 寻找旋转排序数组中的最小值

    153. 寻找旋转排序数组中的最小值

    已知一个长度为 n 的数组,预先按照升序排列,经由 1 到 n 次 旋转 后,得到输入数组。例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:
    若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
    若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]
    注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 。

    给你一个元素值 互不相同 的数组 nums ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

    示例 1:

    输入:nums = [3,4,5,1,2]
    输出:1
    解释:原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。
    

    示例 2:

    输入:nums = [4,5,6,7,0,1,2]
    输出:0
    解释:原数组为 [0,1,2,4,5,6,7] ,旋转 4 次得到输入数组。
    

    示例 3:

    输入:nums = [11,13,15,17]
    输出:11
    解释:原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。
    

    提示:

    n == nums.length
    1 <= n <= 5000
    -5000 <= nums[i] <= 5000
    nums 中的所有整数 互不相同
    nums 原来是一个升序排序的数组,并进行了 1 至 n 次旋转


    leetcode这几天应该是想要我们熟悉使用二分法,全是搜索查找题,这题比较简单,跟昨天题目差不多,因为没有相同值,所以不需要手动恢复二段性,直接用二分法找到分断点,返回即可。

    class Solution {
    public:
        int findMin(vector<int>& nums) {
            int n = nums.size();
            if(n == 1)return nums[0];
            if(n == 2)return min(nums[0],nums[1]);
            int left = 0;
            int right = n - 1;
    
            while(left <= right)
            {
                int mid = left + ((right - left)/2);
                if(nums[mid] >= nums[0])
                    left = mid + 1;
                else if(nums[mid] < nums[0])
                    right = mid - 1;
    
            }
    
            return left == n?nums[0]:nums[left];
            //当left = n时,证明没有旋转,直接返回nums[0]
        }
    
    };
    
  • 相关阅读:
    字体
    当前li的同级且不包含当前li
    溢出用省略号显示
    .NET Core中使用Cookie步骤
    .NET Core中使用Session步骤
    asp.net core 读取配置
    Asp.Net Core run on Ubuntu
    .net core中使用GB2312编码
    ubuntu mysql 安装
    samba的安装
  • 原文地址:https://www.cnblogs.com/xiangqi/p/14642549.html
Copyright © 2011-2022 走看看