LeetCode刷题153-中等-寻找旋转数组的最小值

Posted 布小禅

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题153-中等-寻找旋转数组的最小值相关的知识,希望对你有一定的参考价值。

☀️ 前言 ☀️

算法作为极其重要的一点,是大学生毕业找工作的核心竞争力,所以为了不落后与人,开始刷力扣算法题!

🙀 作者简介 🙀

大家好,我是布小禅,一个尽力让无情的代码变得生动有趣的IT小白,很高兴能偶认识你,关注我,每天坚持学点东西,我们以后就是大佬啦!

📢 博客主页:❤布小禅❤
📢 作者专栏:
❤Python❤
❤Java❤

❤力扣题❤

这是我刷第 42/100 道力扣简单题

💗 一、题目描述 💗

已知一个长度为 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 ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素 。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例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 次旋转

💁 二、题目解析 💁

思 路 1 : \\color{green}{思路1:} 1

先排序,再输出第一个元素

思 路 2 : \\color{green}{思路2:} 2

看了一下题目标签是数组和二分法
那就使用二分查找法
但是一般二分法使用在有序数组中,这怎么办呢?
我们的这个数组也算是有序,因为他是由有序数组旋转过来的
我们想使用二分法,就要找到判断条件
判断中间值与最后一个元素的大小
如果中间值大于最后一个元素

  • 让最开始指针移到中间+1

反之让后面的指针移到中间

🏃 三、代码 🏃

☁️ 1️⃣. python ☁️

思路1:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        nums.sort()
        return nums[0]

思路2:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        start = 0
        end = len(nums)-1
        while start<end:
            mid = (start+end)//2
            if nums[mid]<nums[end]: end = mid
            else: start = mid + 1
        return nums[start]

❄️ 2️⃣. C# ❄️

思路1:

public class Solution {
    public int FindMin(int[] nums){
        Array.Sort(nums);
        return nums[0];
    }
}

思路2:

public class Solution {
    public int FindMin(int[] nums)
        {
            int start = 0;
            int end = nums.Length - 1;
            int mid = 0;
            while (start < end)
            {
                mid = start + (end - start)/2;
                if (nums[mid] < nums[end]) end = mid;  // 比最后一个元素大
                else start = mid + 1;   // 比最后一个元素小
            }
            return nums[start];
        }
}

🌔 结语 🌔

坚持最重要,每日一题必不可少!😸

期待你的关注和督促!😛

以上是关于LeetCode刷题153-中等-寻找旋转数组的最小值的主要内容,如果未能解决你的问题,请参考以下文章

java刷题--153寻找旋转排序数组中的最小值

LeetCode——日常刷题

LeetCode刷题模版:151-155160

LeetCode刷题模版:151-155160

5-004-(LeetCode- 153) 寻找旋转排序数组中的最小值

LeetCode第153题—寻找旋转排序数组中的最小值—Python实现