📌  相关文章
📜  在经过排序和旋转的数组中找到最小的元素(1)

📅  最后修改于: 2023-12-03 15:37:46.001000             🧑  作者: Mango

在经过排序和旋转的数组中找到最小的元素

题目描述

给定一个经过排序和旋转后的数组,找到该数组中最小的元素。

例如,原始数组 nums = [4,5,6,7,0,1,2],它最小元素为 0。

解题思路

由于数组经过旋转后仍然是部分有序的,我们可以运用二分查找的思想,寻找旋转后的数组中的最小值。

具体思路如下:

  • 如果数组为空,直接返回 0;

  • 如果数组只有一个元素,则该元素就是最小值;

  • 如果数组首个元素小于尾个元素,则说明数组未旋转,第一个元素即为最小值;

  • 如果数组首个元素大于尾个元素,则说明数组被旋转过,定义两个指针 (left 和 right),分别指向数组首尾元素。

    • 找到中间值 mid,如果 mid 大于 right 指向的值,则说明最小值在 mid 右边,移动 left 指针到 mid+1 处;

    • 如果 mid 小于 right 指向的值,则说明最小值在 mid 左边或就是 mid,移动 right 指针到 mid 处。

    • 继续对 left 和 right 指向的值进行判断,直到 left 和 right 重合,此时找到的元素即为最小元素。

  • 返回最小元素即可。

代码进行了注释,便于理解:

class Solution:
    def findMin(self, nums: List[int]) -> int:
        # 数组为空,直接返回 0
        if not nums:
            return 0
        # 数组只有一个元素,则该元素就是最小值
        if len(nums) == 1:
            return nums[0]
        # 数组首个元素小于尾个元素,则说明数组未旋转,第一个元素即为最小值
        if nums[0] < nums[-1]:
            return nums[0]
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            # 找到最小值,返回
            if nums[mid] > nums[mid + 1]:
                return nums[mid + 1]
            if nums[mid] < nums[mid - 1]:
                return nums[mid]
            # 如果 mid 大于 right 指向的值,则说明最小值在 mid 右边,移动 left 指针到 mid+1 处
            if nums[mid] > nums[right]:
                left = mid + 1
            # 如果 mid 小于 right 指向的值,则说明最小值在 mid 左边或就是 mid,移动 right 指针到 mid 处
            else:
                right = mid - 1