美文网首页
leetcode154. Find Minimum in Rot

leetcode154. Find Minimum in Rot

作者: 就是果味熊 | 来源:发表于2020-07-25 16:46 被阅读0次

原题链接https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii/
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

Find the minimum element.

The array may contain duplicates.

Example 1:

Input: [1,3,5]
Output: 1
Example 2:

Input: [2,2,2,0,1]
Output: 0

本题主要是会出现一些特殊情况,比如
1.[1,2,3,4,5]未发生翻转的情况
2.[1,1,1,1,1,1]数字全部一样
3.[1,1,1,1,0,1,1,1]数字大部分相等

本题思路是,通过对首尾元素的比较结果进行分类。
若arr[low] == arr[high],则此时大概率是二分法下最坏情况,此时二分法的时间复杂度为O(N),所以直接采用顺序比较。(偷个小懒,更优解法二刷再说)
若arr[low] < arr[high],则最小元素为首位元素。
若arr[low] >arr[high],则采用二分法。

class Solution:
    def findMin(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:return 0
        if n == 1:return nums[0]

        def get_min(arr,low,high):
            mid = low + ((high - low) >> 1)
            if arr[mid] > arr[mid + 1]:
                return arr[mid + 1]
            elif arr[mid] < arr[mid - 1]:
                return arr[mid]
            elif arr[high] > arr[mid] or arr[low] > arr[mid]:
                return get_min(arr,low, mid-1)
            elif arr[low] < arr[mid] or arr[high] < arr[mid]:
                return get_min(arr,mid+1, high)
            
        if nums[0] < nums[n-1]:
            return nums[0]
        elif nums[0] > nums[n-1]:
            return get_min(nums, 0, n-1)
        else:
            mins = float('inf')
            for num in nums:
                if num < mins:
                    mins = num
            return mins

相关文章

网友评论

      本文标题:leetcode154. Find Minimum in Rot

      本文链接:https://www.haomeiwen.com/subject/yulmlktx.html