描述:
(這是乙個 互動式問題 )
給你乙個 山脈陣列 mountainarr,請你返回能夠使得 mountainarr.get(index) 等於 target 最小 的下標 index 值。
如果不存在這樣的下標 index,就請返回 -1。
何為山脈陣列?如果陣列 a 是乙個山脈陣列的話,那它滿足如下條件:
首先,a.length >= 3
其次,在 0 < i < a.length - 1 條件下,存在 i 使得:
a[0] < a[1] < … a[i-1] < a[i]
a[i] > a[i+1] > … > a[a.length - 1]
你將 不能直接訪問該山脈陣列,必須通過 mountainarray 介面來獲取資料:
示例:3 <= mountain_arr.length() <= 10000
0 <= target <= 10^9
0 <= mountain_arr.get(index) <= 10^9
**:
/**
* // this is the mountainarray's api inte***ce.
* // you should not implement it, or speculate about its implementation
* class mountainarray ;
*/class
solution
else
} l = top;
r = mountainarr.
length()
-1;while
(l <= r)
else
}return-1
;}intfindinmountainarray
(int target, mountainarray &mountainarr)
else
}return
solve
(target,mountainarr,l);}
};
顯然,如果山脈陣列是乙個單調遞增或者單調遞減的序列,那麼我們可以通過二分法迅速找到目標值。
而現在題目中有乙個單調遞增序列(峰值左邊)和乙個單調遞減序列(峰值右邊),我們只是不知道兩個序列的分割點,即峰值在**。所以我們第一步應該首先找到峰值。
而峰值也可以使用二分法尋找:
對於乙個範圍 [i, j],我們可以先找到範圍 [i, j] 中間連續的兩個點 mid 與 mid + 1。如果 mountainarr.get(mid + 1) > mountainarr.get(mid),那麼可以知道峰值在範圍 [mid + 1, j] 內;如果 mountainarr.get(mid + 1) < mountainarr.get(mid),那麼可以知道峰值在範圍 [i, mid] 內。通過這樣的方法,我們可以在 o(\log n)o(logn) 的時間內找到峰值所處的下標。
這個方法的正確性在於我們二分的目標是相鄰位置數的差值,我們每次判斷的是 mountainarr.get(mid + 1) - mountainarr.get(mid) 與 0 的大小關係。這個差值組成的陣列保證了單調遞增的部分差值均為正數,單調遞減的部分差值均為負數,整個陣列呈現 [正數,正數,正數,…,負數,負數] 這樣前半部分均為正數,後半部分均為負數的性質,滿足單調性,因此我們可以使用二分查詢。
以示例 1 為例,我們對整個陣列進行差分,即除了第乙個數每個數都減去前乙個數得到新的陣列,最終我們得到 [1, 1, 1, 1, -2, -2],整個差分陣列滿足單調性,可以應用二分法。
原題鏈結
網上二分法的模板:
模板講解
1095 山脈陣列中查詢目標值
這是乙個 互動式問題 給你乙個 山脈陣列 mountainarr,請你返回能夠使得 mountainarr.get index 等於 target 最小 的下標 index 值。如果不存在這樣的下標 index,就請返回 1。所謂山脈陣列,即陣列 a 假如是乙個山脈陣列的話,需要滿足如下條件 首先,...
1095 山脈陣列中查詢目標值
這是乙個 互動式問題 給你乙個 山脈陣列 mountainarr,請你返回能夠使得 mountainarr.get index 等於 target 最小 的下標 index 值。如果不存在這樣的下標 index,就請返回 1。何為山脈陣列?如果陣列 a 是乙個山脈陣列的話,那它滿足如下條件 首先,a...
1095 山脈陣列中查詢目標值 三分 二分
這是乙個 互動式問題 給你乙個 山脈陣列 mountainarr,請你返回能夠使得 mountainarr.get index 等於 target 最小 的下標 index 值。如果不存在這樣的下標 index,就請返回 1。所謂山脈陣列,即陣列 a 假如是乙個山脈陣列的話,需要滿足如下條件 首先,...