leetcode-寻找旋转数组的最小值-153

2021-05-13 12:28

阅读:457

标签:就是   pre   lse   不可   没有   上进   python   查找   二分法   

假设按照升序排序的数组在预先未知的某个点上进行了旋转。

( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。

请找出其中最小的元素。

你可以假设数组中不存在重复元素。

示例 1:

输入: [3,4,5,1,2]
输出: 1
示例 2:

输入: [4,5,6,7,0,1,2]
输出: 0

解题思路:

? 主要思想是二分查找,但是数据旋转的话不是升序或者降序,所以普通的二分法不可以,需要进化,寻找一个变化点(旋转点):中间某一个元素大于第一个元素,那就说明变化点在右边,否则在左

def find_min(nums):
    if len(nums) == 1:
        return nums[0]

    left = 0
    right = len(nums) -1

    if nums[right] > nums[0]:
        "如果最后一个元素大于第一个元素,就说明没有旋转"
        return nums[0]

    while right >= left:
        mid = left + (right - left) // 2
        """
            mid:中间值
                大于下一个值就说明下一个值就是最小值
                前一个值大于这个中间值,说明这个中间值就是变化点
        """
        if nums[mid] > nums[mid + 1]:
            return nums[mid + 1]
        if nums[mid - 1] > nums[mid]:
            return nums[mid]

        """
            中间值大于第一个值,说明最小值在mid右边,通过这个中间值找出变化点(旋转点)
            否则在左边
        """
        if nums[mid] > nums[0]:
            left = mid + 1
        else:
            right = mid - 1


leetcode-寻找旋转数组的最小值-153

标签:就是   pre   lse   不可   没有   上进   python   查找   二分法   

原文地址:https://www.cnblogs.com/hornets/p/13129914.html


评论


亲,登录后才可以留言!