《劍指offer》題解—找出旋轉數組的最小元素(二分法搜索)

題目描述

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。 輸入一個非減排序的數組的一個旋轉,輸出旋轉數組的最小元素。 例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。 NOTE:給出的所有元素都大於0,若數組大小爲0,請返回0。

解題思路——二分法搜索

把一個數組最開始的若干個元素搬到數組的末尾,我們稱之爲數組的旋轉。輸入一個遞增排序的數組的一個旋轉,輸出旋轉數組的最小元素。例如數組{3,4,5,1,2}爲{1,2,3,4,5}的一個旋轉,該數組的最小值爲1。
根據題意說明是一個遞增數組的旋轉,所以如題所示【3,4,5】,【1,2】還是局部遞增的,在這種的數組中查找,一般選擇二分的方法;基本模型有了,下面試着分析:
1.先取出中間的數值,和最後一個比較5>2 說明mid之前的某些部分旋轉到了後面,所以下次尋找 low = mid+1 開始;
2.取出的中間值要是小於high,說明mid-high之間都應爲被旋轉的部分,所以最小應該在mid的前面,但是也有可能當前的mid 就是最小的值 所以下次需找的應該 從mid開始,也即high = mid 開始
3.當*mid == *high的時候,說明數組中存在着相等的數值,可能是這樣的形式 【2,2,2,2,1,2】所以應該選擇的high 應該遞減1 作爲下次尋找的上界。

Python 代碼:

-- coding:utf-8 --

class Solution:
    def minNumberInRotateArray(self, rotateArray):
        # write code here
        long=len(rotateArray)
        if long==0:#如果數組爲空,直接跳出返回0
            return 0
        elif long==1: #如果數組只有一個元素,直接返回這個元素
            return rotateArray[0]
        else:
            left = 0 #設置左指針
            reight = long-1  #設置右指針
            while left < reight:#判斷循環條件
                mid = (left+reight) / 2   #找出中間數
                if rotateArray[mid] > rotateArray[reight]:  #分兩種情況討論 
                    left =mid+1  #如果*mid大於*reight,說明最小數在*mid右邊
                else:
                    reight=mid  #如果*mid小於*reight,說明最小數在*mid左邊
            return rotateArray[left] #返回最小數
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章