LeetCode題解:尋找峯值

尋找峯值(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,水平有限,虛心學習中

其他沉澱

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章