Leetcode1095.題目描述
給你一個 山脈數組 mountainArr,請你返回能夠使得 mountainArr.get(index) 等於 target 最小 的下標 index 值。
如果不存在這樣的下標 index,就請返回 -1。
何爲山脈數組?如果數組 A 是一個山脈數組的話,那它滿足如下條件:
注意:
對 MountainArray.get 發起超過 100 次調用的提交將被視爲錯誤答案。
題目分析:
本題有點長,本文所給出的自定義的山峯數組數據類型,然後只留個兩個接口,一個是長度,一個通過索引值返回對應值。然後山峯數組需要滿足的條件就是,需要大於3,先升後降這樣的,借用leetcode一張圖,畫出來就是下面這樣。
解題思路:
峯值有什麼特點呢,首先峯值的左邊值和右邊值都小於自己,這個特點和其他都不一樣。依舊採用二分搜索,如果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