1095 山脈陣列中查詢目標值 二分搜尋

2021-10-05 14:32:57 字數 1806 閱讀 1943

描述:

(這是乙個 互動式問題 )

給你乙個 山脈陣列 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 假如是乙個山脈陣列的話,需要滿足如下條件 首先,...