1. 程式人生 > 其它 >LeetCode題解:尋找峰值

LeetCode題解:尋找峰值

技術標籤:【演算法與資料結構】# 解題思想:二分法尋找峰值LeeCode資料結構演算法js題解

尋找峰值(middle)

更好的閱讀體驗應該是:

  1. 審題-思考
  2. 答題
  3. 整理-歸納

一、題目

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

  1. 確定初始的左右邊界:
    • left: 0
    • right: nums.length-1
    • mid: (left + (right - left) >> 1)
  2. 查詢條件需要訪問元素的直接右鄰居。
  3. 使用元素的右鄰居來確定是否滿足條件,並決定是向左還是向右。
  4. 保證查詢空間在每一步中至少有 2 個元素。
  5. 需要進行後處理。 當你剩下 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,水平有限,虛心學習中

其他沉澱