(This problem is an interactive problem.)
You may recall that an array A
is a mountain array if and only if:
A.length >= 3
- There exists some
i
with0 < i < A.length - 1
such that:A[0] < A[1] < ... A[i-1] < A[i]
A[i] > A[i+1] > ... > A[A.length - 1]
Given a mountain array mountainArr
, return the minimum index
such that mountainArr.get(index) == target
. If such an index
doesn't exist, return -1
.
You can't 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 indexk
(0-indexed).MountainArray.length()
returns the length of the array.
Submissions making more than 100
calls to MountainArray.get
will be judged Wrong Answer. Also, any solutions that attempt to circumvent the judge will result in disqualification.
Example 1:
Input: array = [1,2,3,4,5,3,1], target = 3 Output: 2 Explanation: 3 exists in the array, at index=2 and index=5. Return the minimum index, which is 2.
Example 2:
Input: array = [0,1,2,4,2,1], target = 3
Output: -1
Explanation: 3 does not exist in the array,
so we return -1.
Constraints:
3 <= mountain_arr.length() <= 10000
0 <= target <= 10^9
0 <= mountain_arr.get(index) <= 10^9
思路:二分,分情况讨论
# """
# This is MountainArray's API interface.
# You should not implement it, or speculate about its implementation
# """
#class MountainArray(object):
# def get(self, index):
# """
# :type index: int
# :rtype int
# """
#
# def length(self):
# """
# :rtype int
# """
class Solution(object):
def findInMountainArray(self, target, mountain_arr):
"""
:type target: integer
:type mountain_arr: MountainArray
:rtype: integer
"""
cache={}
def get(idx):
if idx in cache: return cache[idx]
else:
tmp=mountain_arr.get(idx)
cache[idx]=tmp
return tmp
def helper(lo,hi):
if lo>hi: return float('inf')
if lo==hi: return lo if get(lo)==target else float('inf')
mid=(lo+hi)//2
mid_v = get(mid)
mid2_v= get(mid+1)
if mid2_v>mid_v:
if mid_v==target:
return mid
elif mid_v>target:
return helper(lo,mid-1)
else:
return helper(mid+1,hi)
else:
if mid_v==target:
return min(mid, helper(lo,mid-1))
elif mid_v>target:
return min(helper(mid+1,hi), helper(lo,mid-1))
else:
return helper(lo,mid-1)
res=helper(0,mountain_arr.length()-1)
return res if res!=float('inf') else -1