亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

劍指offer:旋轉數組的最小值

發布時間:2020-06-26 10:38:11 來源:網絡 閱讀:408 作者:Jayce_SYSU 欄目:編程語言

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

class Solution:
    """
    由于整個數組在一定程度上是有序的,因此可以借鑒二分查找的思想,達到接近O(logn)的時間復雜度。
    將一個有序(升序)數組的前x個元素挪到末尾,這里可以分類進行討論。

    第一類:挪動元素個數為數組長度的整數倍,那么這時候等于沒有挪動,最小值出現在idx=0
    第二類:挪動元素個數不是數組長度的整數倍,那么這時候挪動后的數組可以分成兩個子數組,其中左邊子
          數組的元素都是大于等于右邊子數組的。
          [3, 4, 5, 1, 2]
          這時候我們維護兩個指針p1和p2,分別指向左邊子數組和右邊子數組。當中間元素大于等于p1指向
          的元素的時候,則中間元素屬于左邊子數組,反之屬于右邊子數組。
          當兩個指針相鄰的時候p2就指向了右邊子數組的第一個元素,也就是整個數組的最小值。
    第三類:[1, 0, 1, 1, 1]
          當p1和p2指向的元素和中間的元素相等的時候,這時候如果按照第二類的思路,那么會誤判最小值
          在中間元素之后,因此這種情況下我們需要順序查找。
    """
    def minNumberInRotateArray(self, rotateArray):
        if not rotateArray:
            return 0

        # 將mid初始化為0,可以處理第一類情況,因為這時不會進入循環,直接輸出最小值
        left, mid, right = 0, 0, len(rotateArray) - 1

        while rotateArray[left] >= rotateArray[right]:
            # 如果left和right已經相鄰,那么最小值就是right指向的元素
            if left == right - 1:
                mid = right
                break

            mid = (left + right) >> 1
            # 如果left, right, mid指向的元素都相等,那么需要對這個區間進行順序查找,否則按照
            # 第二類情況的解題思路會判斷錯誤
            if rotateArray[left] == rotateArray[mid] == rotateArray[right]:
                return min(rotateArray[left:right + 1])

            # 中間元素在左半邊,最小值出現在右邊子數組[mid, right]
            if rotateArray[left] <= rotateArray[mid]:
                left = mid
            # 中間元素在右半邊,最小值出現在左邊子數組[left, mid]
            else:
                right = mid

        return rotateArray[mid]
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

稷山县| 寻乌县| 恩平市| 陈巴尔虎旗| 东明县| 康马县| 德昌县| 岱山县| 天津市| 正阳县| 扬州市| 汽车| 东台市| 永昌县| 开封县| 兴海县| 库伦旗| 荔波县| 峨眉山市| 广南县| 博湖县| 瑞丽市| 南溪县| 安陆市| 东阳市| 合阳县| 孟津县| 广宗县| 永平县| 嘉善县| 曲麻莱县| 全南县| 宣汉县| 镇赉县| 青海省| 夹江县| 长宁区| 千阳县| 苍南县| 长垣县| 嵩明县|