题目描述
(这是一个 交互式问题 )
给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值。
如果不存在这样的下标 index,就请返回 -1。
何为山脉数组?如果数组 A 是一个山脉数组的话,那它满足如下条件:
首先,A.length >= 3
其次,在 0 < i < A.length - 1 条件下,存在 i 使得:
A[0] < A[1] < … A[i-1] < A[i]
A[i] > A[i+1] > … > A[A.length - 1]
你将 不能直接访问该山脉数组,必须通过 MountainArray 接口来获取数据:
MountainArray.get(k) - 会返回数组中索引为k 的元素(下标从 0 开始)
MountainArray.length() - 会返回该数组的长度
注意:
对 MountainArray.get 发起超过 100 次调用的提交将被视为错误答案。此外,任何试图规避判题系统的解决方案都将会导致比赛资格被取消。
为了帮助大家更好地理解交互式问题,我们准备了一个样例 “答案”:https://leetcode-cn.com/playground/RKhe3ave,请注意这 不是一个正确答案。
解题思路
整体思路还是二分查找。
1.首先按照二分查找的方法,确定mid。通过mid+1 判断 mid前面或者后面是否为升序或者降序。
2.升序或者降序部分按照二分查找的方法进行查找。
3.不能判断顺序的部分,重新回到1
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| # """ # 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: res = [] n = mountain_arr.length() i =0 j =n-1 def findtarge(i, j): # 升序的二分查找 while i <=j: mid = i +(j -i)//2 s = mountain_arr.get(mid) if s == target: res.append(mid) break if s > target: j = mid - 1 if s < target: i = mid + 1 return -1 def findtarge2(i, j): # 降序的二分查找 while i <=j: mid = i +(j -i)//2 s = mountain_arr.get(mid) if s == target: res.append(mid) break if s < target: i = mid + 1 if s > target: j = mid - 1 return -1 def findquery(i, j): # 用于查找顺序序列 if i > j or len(res)==2: return mid = i + (j-i) //2 m = mountain_arr.get(mid) if m == target: res.append(mid) if mid+1<n: t = mountain_arr.get(mid+1) # 用于判断山坡是升序还是降序 if t == target: res.append(mid+1) if m < t: if target < t: findtarge(i, mid-1) findquery(mid+2, j) if m > t: if target < t: findtarge2(mid+2, j) findquery(i, mid-1) return findquery(i, j) print(res) if not res: return -1 return min(res)
|