# Leetcode 1095. Find in Mountain Array
## 題解
先用二分搜索找到山峰值,在把數組切兩半使用二分搜索查找目標,這邊要注意,右邊的數組會是反的,所以要把二分查找的邏輯反過來查找即可。
```python!
# """
# This is MountainArray's API interface.
# You should not implement it, or speculate about its implementation
# """
#class MountainArray:
# def get(self, index: int) -> int:
# def length(self) -> int:
class Solution:
def findInMountainArray(self, target: int, mountain_arr: 'MountainArray') -> int:
# Time complexity: O(n)
# Space complexity: O(1)
n = mountain_arr.length()
def find_mountain(): # 二分搜索查找山峰
nonlocal n
left = 1
right = n - 2
while left < right:
mid = left + (right - left) // 2
prev = mountain_arr.get(mid)
curr = mountain_arr.get(mid + 1)
if prev < curr:
left = mid + 1
else:
right = mid
return left
def binary_search(left: int, right: int,reverse: bool): # 常規二分搜索
nonlocal target,n
while left <= right:
mid = left + (right - left) // 2
num = mountain_arr.get(mid)
if num == target:
return mid
elif num < target:
# 反過來查找
if reverse:
right = mid - 1
else:
left = mid + 1
else:
# 反過來查找
if reverse:
left = mid + 1
else:
right = mid - 1
return -1
mountain = find_mountain()
result = binary_search(0,mountain,False) # 先查找左邊的,因為題目要求最小
if result == -1: # 如果左邊沒有在查找右邊的
result = binary_search(mountain+1,n-1,True)
return result
```