LeetCode刷题记录——第153题(寻找旋转排序数组中的最小值)

题目描述

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

( 例如,数组 [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

思路分析

首先,核心是:只有一次旋转,所以一定有一边要维持原来的状态

  • left < mid < right 说明数组没有旋转,没有变化
  • left < mid > right 最小值一定在右侧,根据旋转的定义,mid肯定要大于right,所以更新规则是left = mid + 1
  • left > mid < right 最小值一定在中间,更新right = mid (排除最小值在右侧的可能)

思路参考:https://blog.csdn.net/qq_17550379/article/details/83684249

代码示例

class Solution:
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        low = 0
        high = len(nums) - 1
        while low <= high:
            mid = (low + high) // 2
            if nums[low] <= nums[mid]:
                if nums[mid] <= nums[high]:
                    return nums[low]
                else:
                    low = mid + 1
            else:
                if nums[mid] <= nums[high]:
                    high = mid
        return -1

2019年4月30日 于武汉家中

你可能感兴趣的:(菜鸟的LeetCode刷题记录)