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


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

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

思路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-中等-寻找旋转数组的最小值

上一篇:[剑指offer]8.重建二叉树


下一篇:巨头的思考:思科的安全与网络业务观