Leetcode1095. 山脈數組中查找目標值

Leetcode1095.題目描述
給你一個 山脈數組 mountainArr,請你返回能夠使得 mountainArr.get(index) 等於 target 最小 的下標 index 值。

如果不存在這樣的下標 index,就請返回 -1。
何爲山脈數組?如果數組 A 是一個山脈數組的話,那它滿足如下條件:

注意:
對 MountainArray.get 發起超過 100 次調用的提交將被視爲錯誤答案。

題目分析:
  本題有點長,本文所給出的自定義的山峯數組數據類型,然後只留個兩個接口,一個是長度,一個通過索引值返回對應值。然後山峯數組需要滿足的條件就是,需要大於3,先升後降這樣的,借用leetcode一張圖,畫出來就是下面這樣。

  調用get函數超過一百次就自動報錯,其實間接說明了你的時間複雜度爲o(logn),很容易想到二分,如果我們知道mountaintop山峯就好,對左邊二分搜索一次,如果沒有,對右邊二分搜索一次,問題解決,所以接下來從怎麼找峯值的索引開始吧。 常規二分搜索在這篇寫過,想了解的請移步

leetcode153. 尋找旋轉排序數組中的最小值

解題思路:
  峯值有什麼特點呢,首先峯值的左邊值和右邊值都小於自己,這個特點和其他都不一樣。依舊採用二分搜索,如果mid值小於mid+1呢,說明峯值在mid+1和r之間,如果大於呢,說明在[l,mid]之間,通過不斷縮小方位,最終的l就對應峯值。
  解決峯值後,在使用常規的二分就可以快速找到target是否存在,如果存在對應位置。代碼如下:

#class MountainArray:
#    def get(self, index: int) -> int:
#    def length(self) -> int:

class Solution:
	#先找峯值,然後二分搜索左邊,如果有直接返回結果,如果返回-1,再搜右邊,直接返回結果即可
    def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
        mid = self.findInMountainTop(mountain_arr)
        l_idx = self.left_index(mid, mountain_arr,target)
        if l_idx==-1:
            return self.right_index(mid, mountain_arr,target)
        else:
            return l_idx

    #二分搜索峯值的下標位置
    def findInMountainTop(self,mountain_arr):
        l = 0
        r = mountain_arr.length()-1
        while(l<r):
            mid = (l+r)//2
            if mountain_arr.get(mid)<mountain_arr.get(mid+1):
                l = mid+1
            else:
                r = mid
        return l
	 #二分搜索左邊空間函數
    def left_index(self, mid, mountain_arr,target):
        l = 0
        r = mid
        while(l<r):
            mid = (l+r)//2
            if mountain_arr.get(mid)==target:
                return mid
            elif mountain_arr.get(mid)>target:
                r = mid
            else:
                l = mid+1
        return -1
    #二分搜索右邊空間函數
    def right_index(self,mid,mountain_arr,target):
        l = mid
        r = mountain_arr.length()
        while(l<r):
            mid = (l+r)//2
            if mountain_arr.get(mid)==target:
                return mid
            elif mountain_arr.get(mid)<target:
                r = mid
            else:
                l = mid+1
        return -1
  不知道大家有沒有這種情況,有時候每次運行的速度都不一樣的問題。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章