題目:把一個數(shù)組最開始的若干個元素搬到數(shù)組的末尾,我們稱之為數(shù)組的旋轉(zhuǎn)志于。 輸入一個非遞減排序的數(shù)組的一個旋轉(zhuǎn)铐望,輸出旋轉(zhuǎn)數(shù)組的最小元素。 例如數(shù)組 {3,4,5,1,2} 為 {1,2,3,4,5} 的一個旋轉(zhuǎn)碰煌,該數(shù)組的最小值為 1。 NOTE:給出的所有元素都大于 0绅作,若數(shù)組大小為 0芦圾,請返回 0。
思路:
首先這是一個特殊的有序數(shù)組俄认,如果直接遍歷一遍个少,找到最小值時間復雜度O(n)洪乍,不符合要求
所以思考采用二分查找的方法,分別包含以下幾種情況:
1)如果數(shù)組長度為0夜焦,返回0
2)如果數(shù)組第一個元素比最后一個元素小壳澳,意味著數(shù)組完全翻轉(zhuǎn)(也即沒有翻轉(zhuǎn)),則返回數(shù)組第一個元素
3)使用二分法茫经,構(gòu)建兩個索引巷波,left,right代表左右兩端的位置卸伞,設mid=(left+right)/2
設置循環(huán)條件right-left>1抹镊,即左端點和右端點相距超過1才繼續(xù)循環(huán):
如果mid處的值比右端點的值大,則left=mid
如果mid處的值比左端點小荤傲,則right=mid
如果不滿足以上兩種情況垮耳,即同時滿足array[mid]<=right,mid>=left,left>=right遂黍,即mid=left=right,
則表明左中右重復元素太多且包含最小元素终佛,則遍歷這一部分的元素找出最小值
返回right索引位置的值
Python代碼如下:
class Solution(object):
def minNumInRotateArray(self,rotateArray):
if len(rotateArray)==0:
return 0
else:
left = 0
right = len(rotateArray)-1
minVal = rotateArray[0]
if rotateArray[left]<rotateArray[right]:
return rotateArray[0]
else:
while right-left>1:
mid = (left+right)/2
if rotateArray[mid]<rotateArray[left]:
right=mid
elif rotateArray[mid]>rotateArray[right]:
left=mid
else:
for item in rotateArray[left:right+1]:
if item<minVal:
minVal = item
return minVal
return rotateArray[right]
s = Solution()
ls = [4,5,6,1,2,3]
print s.minNumInRotateArray(ls) # 1