一魚多吃 用 二分搜尋的觀念,來尋找絕對最大值 Peak Index in Mountain_Leetcode #852

更新於 發佈於 閱讀時間約 3 分鐘

這題題目在這裡:

Peak Index in a Mountain Array - LeetCode

題目會給定一個陣列,陣列裡面的元素分布就像一座山峰。

最大值的左邊都是上坡段,最大值的右邊都是下坡段。

要求我們找出陣列裡面的絕對極大值(absolute max value)所在的陣列索引

也就是說當下這個元素大於左邊鄰居的元素值,也大於右邊鄰居的元素值。

nums[i] > nums[i-1] > ... > nums[0] 且

nums[i] > nums[i+1] > ... > nums[n-1]

答案只會有一組解。


測試範例:

Example 1:

Input: arr = [0,1,0]
Output: 1

Example 2:

Input: arr = [0,2,1,0]
Output: 1

Example 3:

Input: arr = [0,10,5,2]
Output: 1

 


約束條件:

Constraints:

  • 3 <= arr.length <= 105
  • 0 <= arr[i] <= 106
  • arr is guaranteed to be a mountain array.

演算法:

先回顧一個基本性質,在已經排序好的陣列元素裡面搜尋,適合使用二分搜尋法

基本上和前一題用到的都是同樣的觀念,和鄰居去比較,
每次判斷是上坡還是下坡,去決定搜尋的方向。

假如現在是上坡絕對最大值肯定在我的右邊

假如現在是下坡絕對最大值肯定在我的左邊

raw-image

程式碼:

class Solution:
 def peakIndexInMountainArray(self, arr: List[int]) -> int:
  
  
  def helper(nums, left, right):
  
   if left == right:
    # base case:
    return left
   
   mid = ( left + right ) // 2
   
   # general case
   if nums[mid] > nums[mid+1]:
    # peak is either nums[mid] or on the left hand side
    return helper(nums, left, mid)
   else:
    # peak is either nums[mid+1] or on the right hand side
    return helper(nums, mid+1, right)
   

   
  return helper( arr, 0 , len(arr)-1)



時間複雜度:

O( log n ) : 每次都能淘汰一半不可能的區間,最多花費O( log n )次可以找到絕對最大值,也就是山峰。

空間複雜度:

O( log n ): 遞迴stack深度最大為O( log n ),最多花費O( log n )層可以抵達終止條件。


這題學完,記得去複習經典的Binary searchSearch a 2D MatrixSqrt(x)
Find Peak Element,背後的二分搜尋法原理和對半切從中心點去逼近解答、目標值的想法都是相通的喔!


Reference:

[1] Peak Index in a Mountain Array - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給定一個陣列,裡面有大有小,可以把數字的大小類比成高度 要求我們找出陣列裡面的相對極大值(relative max value)所在的陣列索引 也就是說當下這個元素,大於左邊鄰居的元素值,也大於右邊鄰居的元素值
題目會給定我們一個陣列,並且定義了一種三角形合併的操作。 當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。 要求我們返回最後一層的答案。 測試範例: Example 1: Input: nums = [1,2,
這題的題目在這裡 題目會給定一個輸入整數x, 要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
題目會給定一個陣列,裡面有大有小,可以把數字的大小類比成高度 要求我們找出陣列裡面的相對極大值(relative max value)所在的陣列索引 也就是說當下這個元素,大於左邊鄰居的元素值,也大於右邊鄰居的元素值
題目會給定我們一個陣列,並且定義了一種三角形合併的操作。 當下這一排相鄰的兩項相加,對mod 10取餘數,會成為下一排的對應項,一直反覆操作,直到剩下一個元素為止。 要求我們返回最後一層的答案。 測試範例: Example 1: Input: nums = [1,2,
這題的題目在這裡 題目會給定一個輸入整數x, 要求我們返回x的正整數平方根(取無條件捨去小數部分的正整數值)
這題基本上是前一題巴斯卡三角形的孿生題,那題和這題的本質是完全一樣的,只是題目要求稍有不同。 前一題求的是整個巴斯卡三角形,這一題求的是巴斯卡三角形的最後一層。
在學習過比較基本的DP模型 費式數列、爬樓梯、找零錢...等之後, 來看一個比較進階而且實用的DP模型,前綴和(Prefix sum), 可以再加以延伸推廣,來計算 區間和(Range Sum)。
上次學過2D DP入門題目 Unique Path,接著來看進階一點的高度關聯延伸題 Unique Path II,這次板子上多了障礙物。 題目給定我們一個棋盤的高與寬,起點固定在左上角,終點固定在右下角。 每一步只能選擇往右走一格,或者往下走一格,不能回頭。 有障礙物的格子無法通過。
你可能也想看
Google News 追蹤
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
強者都一日單攻雪山主峰順道撿個雪山東峰,小弟我是弱雞,只能單攻雪山東峰。 從標高2140公尺的大水池登山口,到標高3201公尺的雪山東峰,總共5K的路程,爬升1061公尺。
Thumbnail
🛤️D1 滑雪山莊 奇萊山登山口 ▸1.4K ▸小奇萊▸2.3K ▸黑水塘山屋▸1.1K ▸成功山屋▸0.9K ▸奇萊北峰岔口▸0.9K ▸奇萊稜線山屋 主峰標高3560m百岳20 北峰是奇萊連峰中最高的山峰,山形尖銳險峭,列為「十峻」之一 從成功山屋到稜線,將近一千公尺的爬升高度是行程裡最辛苦的
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
01/04/2017 山海中的島與峰—Way to island peak   今早離開觸空前,我特地再去看了當年在這裏見到的這個指標。 上面簡單寫著,Way to island peak。   記得當時我站在指標前, 這簡單的指標像是有著魔力般的吸引著我。   指標後方就是島峰的
01/01/2017 山海中的島與峰—倒數   清晨六點五十一分,天氣晴。   我己經可以看到梅樂峰的峰頂,小小的一點出現在遠方的山崚線上。 今早打包,越來越快,己經養成一些習慣。 我把一些需要的東西,放在最上面,最不常用的則放在下面。 打包時,最後才放進去的,也一定是到營地後最先穿
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String
Thumbnail
隨著理財資訊的普及,越來越多台灣人不再將資產侷限於台股,而是將視野拓展到國際市場。特別是美國市場,其豐富的理財選擇,讓不少人開始思考將資金配置於海外市場的可能性。 然而,要參與美國市場並不只是盲目跟隨標的這麼簡單,而是需要策略和方式,尤其對新手而言,除了選股以外還會遇到語言、開戶流程、Ap
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
強者都一日單攻雪山主峰順道撿個雪山東峰,小弟我是弱雞,只能單攻雪山東峰。 從標高2140公尺的大水池登山口,到標高3201公尺的雪山東峰,總共5K的路程,爬升1061公尺。
Thumbnail
🛤️D1 滑雪山莊 奇萊山登山口 ▸1.4K ▸小奇萊▸2.3K ▸黑水塘山屋▸1.1K ▸成功山屋▸0.9K ▸奇萊北峰岔口▸0.9K ▸奇萊稜線山屋 主峰標高3560m百岳20 北峰是奇萊連峰中最高的山峰,山形尖銳險峭,列為「十峻」之一 從成功山屋到稜線,將近一千公尺的爬升高度是行程裡最辛苦的
Thumbnail
分享在網路上看到的陣列題目。通常 for...of 的 value 是陣列中的每個值,那如果我們在迭代中對陣列操作會發生什麼事? 題目來源:https://x.com/_jayphelps/status/1774640511158022335?s=20
01/04/2017 山海中的島與峰—Way to island peak   今早離開觸空前,我特地再去看了當年在這裏見到的這個指標。 上面簡單寫著,Way to island peak。   記得當時我站在指標前, 這簡單的指標像是有著魔力般的吸引著我。   指標後方就是島峰的
01/01/2017 山海中的島與峰—倒數   清晨六點五十一分,天氣晴。   我己經可以看到梅樂峰的峰頂,小小的一點出現在遠方的山崚線上。 今早打包,越來越快,己經養成一些習慣。 我把一些需要的東西,放在最上面,最不常用的則放在下面。 打包時,最後才放進去的,也一定是到營地後最先穿
Thumbnail
題目 : 28. Find the Index of the First Occurrence in a String