(This problem is an interactive problem.)
An array arr is called a mountain array if and only if:
arr.length >= 3i with 0 < i < arr.length - 1 such that:arr[0] < arr[1] < ... < arr[i - 1] < arr[i]arr[i] > arr[i + 1] > ... > arr[arr.length - 1]You are given a mountain array mountainArr and an integer target, return the minimum index such that mountainArr.get(index) == target. If such an index does not exist, return -1.
You cannot access the mountain array directly. You may only access the array using a MountainArray interface:
MountainArray.get(k) returns the element of the array at index k (0-indexed).MountainArray.length() returns the length of the array.You can only make at most 100 calls to the function get(). Submissions making more than 100 calls will be judged as Wrong Answer. Also, any solutions that attempt to circumvent the judge will result in disqualification.
Example 1:
Input: mountainArr = [2,4,5,2,1], target = 2
Output: 0Example 2:
Input: mountainArr = [1,2,3,4,2,1], target = 6
Output: -1Constraints:
3 <= mountainArr.length() <= 10,0000 <= target, mountainArr.get(index) <= 1,000,000,000# """
# 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, mountainArr: 'MountainArray') -> int:
n = mountainArr.length()
for i in range(n):
if mountainArr.get(i) == target:
return i
return -1# """
# 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, mountainArr: 'MountainArray') -> int:
length = mountainArr.length()
# Find Peak
l, r = 1, length - 2
while l <= r:
m = (l + r) // 2
left, mid, right = mountainArr.get(m - 1), mountainArr.get(m), mountainArr.get(m + 1)
if left < mid < right:
l = m + 1
elif left > mid > right:
r = m - 1
else:
break
peak = m
# Search left portion
l, r = 0, peak - 1
while l <= r:
m = (l + r) // 2
val = mountainArr.get(m)
if val < target:
l = m + 1
elif val > target:
r = m - 1
else:
return m
# Search right portion
l, r = peak, length - 1
while l <= r:
m = (l + r) // 2
val = mountainArr.get(m)
if val > target:
l = m + 1
elif val < target:
r = m - 1
else:
return m
return -1# """
# 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, mountainArr: 'MountainArray') -> int:
length = mountainArr.length()
cache = {}
def get(i):
if i not in cache:
cache[i] = mountainArr.get(i)
return cache[i]
# Find Peak
l, r = 1, length - 2
while l <= r:
m = (l + r) >> 1
left, mid, right = get(m - 1), get(m), get(m + 1)
if left < mid < right:
l = m + 1
elif left > mid > right:
r = m - 1
else:
break
peak = m
def binary_search(l, r, ascending):
while l <= r:
m = (l + r) >> 1
val = get(m)
if val == target:
return m
if ascending == (val < target):
l = m + 1
else:
r = m - 1
return -1
# Search left portion
res = binary_search(0, peak, True)
if res != -1:
return res
# Search right portion
return binary_search(peak, length - 1, False)