Leetcode 33, 81, Find Minimum in Rotated Sorted Array I and II

Suppose a sorted array 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.

You may assume no duplicate exists in the array.

 

在任何一个sublist中,如果头元素大于尾元素,那么这个minimum一定在这个sublist中间的某一个位置。可以用二分法找到这个元素,复杂度是O(logN)。本题O(N)的算法也可以通过OJ,思路就是最简答的从头元素往后比,直到出现 nums[i] > nums[i+1]的情况,那么nums[i+1]就是Minimum element。

 

 1 class Solution(object):
 2     def findMin(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: int
 6         """
 7         n = len(nums)
 8         left = 0
 9         right = n-1
10         while left < right:
11             mid = (left+right)//2
12             if nums[mid] > nums[right]:
13                 left = mid + 1
14             else:
15                 right = mid
16         return nums[left]
17         

 

以下引用来自: http://bangbingsyb.blogspot.com/2014/11/leecode-find-minimum-in-rotated-sorted.html

和Search in Rotated Sorted Array II这题换汤不换药。同样当A[mid] = A[end]时,无法判断min究竟在左边还是右边。
 
3 1 2 3 3 3 3 
3 3 3 3 1 2 3
 
但可以肯定的是可以排除A[end]:因为即使min = A[end],由于A[end] = A[mid],排除A[end]并没有让min丢失。所以增加的条件是:
 
A[mid] = A[end]:搜索A[start : end-1]
 
 1 class Solution(object):
 2     def findMin(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: int
 6         """
 7         n = len(nums)
 8         left = 0
 9         right = n-1
10         while left < right:
11             mid = (left+right)//2
12             if nums[mid] > nums[right]:
13                 left = mid + 1
14             elif nums[mid] < nums[right]:
15                 right = mid
16             else:
17                 right -= 1
18         
19         return nums[left]

 

posted @ 2016-12-16 06:42  lettuan  阅读(95)  评论(0编辑  收藏  举报