尋找峰值(middle)
更好的閱讀體驗應該是:
- 審題-思考
- 答題
- 整理-歸納
一、題目
LeetCode:162.尋找峰值
峰值元素是指其值大于左右相鄰值的元素,
給定一個輸入陣列 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,水平有限,虛心學習中
其他沉淀
- JavaScript 版 LeetCode 題解
- 前端進階筆記
- CSDN
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/235507.html
標籤:其他
下一篇:前端學習(2733):重讀vue電商網站43之使用 lodash 中 cloneDeep(obj) 來實作深拷貝
