169 - 153 寻找旋转排序数组最小值 - 006

题目

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

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

解答

二分法

class Solution:
    def findMin(self, nums: List[int]) -> int:
        if not nums:
            return 0
        left = 0
        right = len(nums)-1
        while left < right:
            mid = left + ((right-left) >> 1)
            if nums[right] < nums[mid]:
                left = mid+1
            else:
                right = mid
        return nums[left]

Runtime: 28 ms, faster than 99.79% of Python3 online submissions for Find Minimum in Rotated Sorted Array.

Memory Usage: 12.8 MB, less than 100.00% of Python3 online submissions for Find Minimum in Rotated Sorted Array.

func findMin(nums []int) int {
    if nums == nil {
        return 0
    }
    if len(nums) == 1 {
        return nums[0]
    }
    left := 0
    right := len(nums) - 1
    for left < right {
        mid := left + ((right - left) >> 1)
        if nums[right] < nums[mid] {
            left = mid + 1
        } else {
            right = mid
        }
    }
    return nums[left]
}

Runtime: 0 ms, faster than 100.00% of Go online submissions for Find Minimum in Rotated Sorted Array.

Memory Usage: 2.5 MB, less than 100.00% of Go online submissions for Find Minimum in Rotated Sorted Array.

var findMin = function(nums) {
  if (nums.length == 0) {
    return 0
  }
  if (nums.length == 1) {
    return 1
  }
  let left = 0
  right = nums.length - 1
  while (left < right) {
    let mid = left + ((right - left) >> 1)
    if (nums[right] < nums[mid]) {
      left = mid + 1
    } else {
      right = mid
    }
  }
  return nums[left]
};

Runtime: 56 ms, faster than 65.35% of JavaScript online submissions for Find Minimum in Rotated Sorted Array.

Memory Usage: 33.8 MB, less than 75.00% of JavaScript online submissions for Find Minimum in Rotated Sorted Array.

分治

https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/solution/er-fen-fa-fen-zhi-fa-python-dai-ma-java-dai-ma-by-/

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

        def helper(left, right):
            if left == right:
                return nums[left]
            if left + 1 == right:
                return min(nums[left], nums[right])
            mid = left + ((right-left) >> 1)
            return min(helper(left, mid), helper(mid+1, right))

        return helper(0, len(nums)-1)

Runtime: 36 ms, faster than 94.37% of Python3 online submissions for Find Minimum in Rotated Sorted Array.

Memory Usage: 13 MB, less than 100.00% of Python3 online submissions for Find Minimum in Rotated Sorted Array.

Last updated

Was this helpful?