劍指offer 7. 旋轉陣列的最小數字
阿新 • • 發佈:2018-12-16
原題
把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。
My Answer
解題思路:
利用二分法進行查詢最小數,尤其要注意的是這裡判別條件是if end - start > 1:
不再是 end > start
,而是要間隔到1,因為事實上,帶入輸入[3,4,5,1,2]會發現,end到後面一直為3,start一直為2,mid在2與3之間徘徊,如果採用 end > start
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
class Solution:
def minNumberInRotateArray(self, rotateArray):
# write code here
if not rotateArray:
return 0
start, end, mid = 0, len(rotateArray) - 1, (len( rotateArray) - 1)/2
while True:
#rotateArray = rotateArray[start:end]
if end - start > 1:
mid = int(start + end)/2)
if rotateArray[mid] < rotateArray[end]:
# the back of array is the sorted
end = mid
else: # find the reverse list in the back of array
start = mid
else:
if rotateArray[start] < rotateArray[end]:
return rotateArray[start]
else:
return rotateArray[end]
參考答案
解題思路:
使用二分法,但要考慮[1, 0, 0, 1]這種資料,只能順序查詢
def find_min(nums):
if not nums:
return False
length = len(nums)
left, right = 0, length - 1
while nums[left] >= nums[right]:
if right - left == 1:
return nums[right]
mid = (left + right) / 2
if nums[left] == nums[mid] == nums[right]:
return min(nums)
if nums[left] <= nums[mid]:
left = mid
if nums[right] >= nums[mid]:
right = mid
return nums[0]
注:參考答案只是將 if right - left == 1:
放到了迴圈裡面判斷罷了,其本質與自身答案一樣。