Leetcode # 1095. Find in Mountain Array
- 2022.07.20
- Binary Method / Divide and Conquer LeetCode
https://leetcode.com/problems/find-in-mountain-array/
相關例題
Leetcode # 852. Peak Index in a Mountain Array
Solution
- 先找到山頂(參考 Leetcode # 852. Peak Index in a Mountain Array )
- 從山頂將 array 一分為二
各別做 binary search(要注意是遞增或遞減)
Time Complexity: O(log(len(mountain_arr)))
Space Complexity: O(1)
class Solution:
def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
length = mountain_arr.length()
l, r = 0, length - 1
value = {
l: mountain_arr.get(l),
r: mountain_arr.get(r)
}
if value[l] == target:
return l
# find top, ref leetcode # 852
while l < r:
mid = (l + r) // 2
for i in range(2):
if mid + i not in value:
value[mid + i] = mountain_arr.get(mid + i)
if value[mid + 1] - value[mid] > 0:
l = mid + 1
else:
r = mid
top = l
if value[top] < target:
return -1
# binary search
for line in [(0, top), (top, length -1)]:
# ascend or descend
sign = 1 if value[line[1]] > value[line[0]] else -1
if min(value[line[0]], value[line[1]]) > target:
continue
l, r = line
while l <= r:
print(l, r)
mid = (l + r) // 2
if mid not in value:
value[mid] = mountain_arr.get(mid)
if value[mid] == target:
return mid
elif sign * value[mid] < sign * target:
l = mid + 1
else:
r = mid - 1
return -1
Last Updated on 2023/08/16 by A1go