【leetcode】Find Minimum in Rotated Sorted Array I&&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.

解题思路:

在一个有顺序的数组中查找个最小值,很容易想到的就是二分法,的确,这里用的就是二分,不过要做一点改进。
改进的思路是这样的:
1.我们容易想到最好的情况就是这个数组是普通的排好序的,如【1,2,3,4】,那么最小的必然是下标最小的。用旋转的情况假设第一个小于最后一个那么最小值肯定也是第一个,也就是说计算过程中只要找到left<right的结果就出来了 2、如果这里面出现了rotate的话,如【3,4,1,2】那么最小值肯定会出现在左右的一遍,那么到底是哪边呢,这里我们可以比较最左和最后值的大小,比如这里`3="">2说明在这里前面的那个3是旋转过去的。这是后我们就要用中间那个值,这里是(0+3)/2=1`这里4>2(right)说明最小值应该实在后半块里的,于是乎改left就好。反之是改right就是一样的过程了,就是一个二分的思想

 1 class Solution:
 2     # @param num, a list of integer
 3     # @return an integer
 4     def findMin(self, num):
 5         l = len(num)
 6         left = 0
 7         right = l-1
 8         while num[left] > num[right]:
 9             mid = (left +right)/2
10             if num[mid] < num[right]:
11                 right = mid
12             else :
13                 left = mid + 1
14         return num[left]
15 
16 a = [3,0,1,2]        
17 #a = [4, 5, 6, 7, 8, 9, 18,19, 0, 1, 2, 3]
18 s = Solution()
19 print s.findMin(a)
20     

 

加深问题:Find Minimum in Rotated Sorted Array II

题目描述:

跟上面的一样,唯一改变的是现在数字可以重复了

解题思路:


这个看起来改了一点,实际上直接用上面的方法就很难得出结果里,leetcode给这个的评级是hard,但是我开始实在是想不出有什么好办法,后来发现解法是:对于相等的存在无法判断只能暴力-_-#。不过我的代码有点丑陋,直接上一题加的,改了个特殊情况,leetcode的标程比这个好看些,不过效率差不多。

 1 class Solution:
 2     # @param num, a list of integer
 3     # @return an integer
 4     def findMin(self, num):
 5         l = len(num)
 6         left = 0
 7         right = l-1
 8         while num[left] >= num[right]:
 9             mid = (left +right)/2
10             if num[mid] < num[right]:
11                 right = mid
12             elif num[left] > num[right]:
13                 left = mid + 1
14             else :
15                 if right == left:
16                     return num[left]
17                 res = 10000
18                 for i in xrange(0,l):
19                     if num[i] < res:
20                         res = num[i]
21                 return res
22         return num[left]
23 
24 a = [2,0,1,1,1]        
25 #a = [3,4, 5, 6, 7, 8, 9, 18,19, 0, 1, 2, 3]
26 s = Solution()
27 print s.findMin(a)
28     

 

posted @ 2014-11-20 11:46  mrbean  阅读(300)  评论(0编辑  收藏  举报