前往
大廳
主題

LeetCode - 1095. Find in Mountain Array 解題心得

Not In My Back Yard | 2024-03-28 12:00:04 | 巴幣 0 | 人氣 45

題目連結:


題目意譯:
(本題為一道互動題)

你可能還記得一個陣列 arr 為一個山陣列(Mountain Array),若且唯若:
    arr.length >= 3
    存在一個 i 值,其中 0 < i < arr.length - 1 使得:
        arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
        arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

給定一個山陣列 mountainArr,回傳最小索引值 index 滿足 mountainArr.get(index) == 目標值 target。如果不存在這樣子的索引值,則回傳 -1。

你不得直接存取該山陣列。你只能存取該陣列藉由一個界面 MountainArray:
    MountainArray.get(k) 回傳位於索引值 k(索引值從 0 開始數)的元素。
    MountainArray.length() 回傳該陣列的長度。

繳交的程式碼倘若呼叫超過 100 次的 MountainArray.get() 則將會被視為「錯誤答案」(Wrong Answer)。同時,任何試圖繞過評測系統的解答將失去資格。(譯者注:「失去資格」原本應是用於 weekly 競賽之中。而現在只是一個普通的公開題目,所以如果有人要把 Leetcode 當 CTF 打基本上也不會有人阻止。當然,除非你把網站直接打爆 XD)

限制:
3 <= mountain_arr.length() <= 10 ^ 4
0 <= target <= 10 ^ 9
0 <= mountain_arr.get(index) <= 10 ^ 9



範例測資:
範例 1:
輸入: array = [1,2,3,4,5,3,1], target = 3
輸出: 2
解釋: 3 存在於陣列中,分別位於索引值 2 和 5。回傳其中最小者,其值為 2。

範例 2:
輸入: array = [0,1,2,4,2,1], target = 3
輸出: -1
解釋: 3 不存在於陣列中,所以我們回傳 -1。


解題思維:
首先,先找到「山峰」在哪裡。參見這題

之後,我們便可以將整個山陣列從「山峰」一分為二變成「左側」和「右側」。而「左側」和「右側」各自會是一個有排序的陣列(一個由小到大、另一個由大到小),因此我們可以再各自使用一次二分搜尋法(Binary Search)來在「左側」和「右側」找尋 target 存不存在。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作