leetcode162為什麼能用二分法求解

2021-10-21 13:49:58 字數 795 閱讀 5211

這道題。。我第一遍沒做出來。參看了一些題解後,感覺它們大部分都沒講明白這道題為什麼可以用二分法。

所以這裡就把我的思考分享出來吧。

首先,我們需要注意題目的三個條件:

(1)限定了nums[i]!=nums[i+1],這為我們排除了出現連續相等子串行的情況。

(2)num[-1]和num[n]的值為負無窮,那麼陣列在左邊界單調增,在右邊界單調減,簡單分析可知,這使得陣列中一定存在乙個極大值。

(3)只需找到任意乙個極大值的索引。

那麼,基於減治的思想,我們可以在陣列中尋找滿足條件(2)的子陣列,並逐步縮小搜尋範圍,直到找乙個極大值。

為了滿足時間複雜度為o(logn)的要求,我們對中間位置的元素進行探索,每次將搜尋範圍縮小為之前的一半。

具體而言,對於中間位置元素num[mid]:

若num[mid] > num[mid+1],num[l, mid]左右邊界分別是單調增和單調減區域,滿足條件(2),而num[mid+1,r]左右邊界都是單調減區域,不滿足條件(2),令r=mid以縮小範圍;

若num[mid] < num[mid+1],num[l, mid]左右邊界都是單調增區域,不滿足條件(2),而num[mid+1,r]左右邊界分別是單調增和單調減區域,滿足條件(2),令l=mid+1縮小範圍;

**如下:

class solution 

return l;}};

LeetCode 162 尋找峰值

題目描述 峰值元素是指其值大於左右相鄰值的元素。給定乙個輸入陣列nums,其中nums i nums i 1 找到峰值元素並返回其索引。陣列可能包含多個峰值,在這種情況下,返回任何乙個峰值所在位置即可。你可以假設nums 1 nums n 示例 輸入 nums 1,2,3,1 輸出 2 解釋 3 是...

LeetCode 162 尋找峰值

峰值元素是指其值大於左右相鄰值的元素。給定乙個輸入陣列nums,其中nums i nums i 1 找到峰值元素並返回其索引。陣列可能包含多個峰值,在這種情況下,返回任何乙個峰值所在位置即可。你可以假設nums 1 nums n 示例 1 輸入 nums 1,2,3,1 輸出 2解釋 3 是峰值元素...

LeetCode162 尋找峰值

峰值元素是指其值大於左右相鄰值的元素。給定乙個輸入陣列 nums,其中 nums i nums i 1 找到峰值元素並返回其索引。陣列可能包含多個峰值,在這種情況下,返回任何乙個峰值所在位置即可。你可以假設 nums 1 nums n 示例 1 輸入 nums 1,2,3,1 輸出 2 解釋 3 是...