1. 程式人生 > >劍指offer 7. 旋轉陣列的最小數字

劍指offer 7. 旋轉陣列的最小數字

原題

把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{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

勢必陷入死迴圈,故而在這裡讓其間隔為1時,完成迴圈查詢,只需在兩者之間找到一個最小數返回即可。

# -*- 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:放到了迴圈裡面判斷罷了,其本質與自身答案一樣。