LeetCode題解:尋找峰值
阿新 • • 發佈:2020-12-17
技術標籤:【演算法與資料結構】# 解題思想:二分法尋找峰值LeeCode資料結構演算法js題解
尋找峰值(middle)
更好的閱讀體驗應該是:
- 審題-思考
- 答題
- 整理-歸納
一、題目
峰值元素是指其值大於左右相鄰值的元素。
給定一個輸入陣列 nums
,其中 nums[i] ≠ nums[i+1]
,找到峰值元素並返回其索引。
陣列可能包含多個峰值,在這種情況下,返回任何一個峰值所在位置即可。
你可以假設 nums[-1] = nums[n] = -∞
。
輸入: nums = [1,2,1,3,5,6,4] 輸出: 1 或 5 解釋: 你的函式可以返回索引 1,其峰值元素為 2;或者返回索引 5, 其峰值元素為 6。
你的解法應該是 O(logN)
時間複雜度的。
二、基礎模版 II
- 確定初始的左右邊界:
left
: 0right
: nums.length-1mid
: (left + (right - left) >> 1)
- 查詢條件需要訪問元素的直接右鄰居。
- 使用元素的右鄰居來確定是否滿足條件,並決定是向左還是向右。
- 保證查詢空間在每一步中至少有 2 個元素。
- 需要進行後處理。 當你剩下 1 個元素時,迴圈 / 遞迴結束。 需要評估剩餘元素是否符合條件。
三、題解
分析模版
- 我們的目標是:尋找一段順序區間內最大的元素
- 我們擁有的訪問區間不是順序的,我們需要自己劃分
Javasciprt 程式碼
/**
* @param {number[]} nums
* @return {number}
*/
var findPeakElement = function(nums) {
let left = 0;
let right = nums.length - 1;
while (left < right) {
let mid = left + ((right - left) >> 1);
// 這裡需要保證區間內有2個元素
if (nums[mid] < nums[mid + 1]) {
// 這證明 mid + 1 更有可能是當前區間的峰值,並且左側是遞減區間,可以拋棄
left = mid + 1; //
} else {
// 這證明 mid 更有可能是當前區間的峰值,並且右側是遞減區間,可以拋棄,但注意保留mid
right = mid;
}
}
return left;
};
四、寫在最後
本文是二分查詢-模版 II 的第二題,你可能意識到了,相對應的 leetcode 給他們標出中等的難度,加油!
如果對你有所幫助不妨給本專案的github 點個 star,這是對我最大的鼓勵~
關於我
- 花名:餘光
- WX:j565017805
- 沉迷 JS,水平有限,虛心學習中
其他沉澱