題目連結:
題目意譯:
讓我們定義一陣列 arr 為一座「山」,如果以下特性滿足:
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]
給定一整數陣列 arr 其保證為一座山,回傳上述定義中的 i 值使得 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 。
限制:
3 ≦ arr.length ≦ 10 ^ 4
0 ≦ arr[i] ≦ 10 ^ 6
arr 保證為一個「山」陣列。
進階: 找到 O(n) 的解法很直觀,那麼你能找到 O(log(n)) 的解法嗎?
範例測資:
範例 1:
輸入: arr = [0,1,0]
輸出: 1
範例 2:
輸入: arr = [0,2,1,0]
輸出: 1
範例 3:
輸入: arr = [0,10,5,2]
輸出: 1
範例 4:
輸入: arr = [3,4,5,1]
輸出: 2
範例 5:
輸入: arr = [24,69,100,99,79,78,67,36,26,19]
輸出: 2
解題思維:
O(n) 解法就不贅述了,就是直接掃過 arr 就可以找到了。
而 O(log(n)) 則需要使用二分搜尋法(Binary Search),其精神可以參見
這題或是
這題。
而本題的搜尋條件可以定為 arr[middle] > arr[middle + 1],當前述條件為真則將上界 upper 調整為 middle,反之則將下界 lower 變為 middle + 1(lower 和 upper 初始值於此應定為 1 以及 arr.length - 2)。
當 lower 等於 upper 時,lower 之值即是所求的 i 值。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。