1095. 山脉数组中查找目标值(Rating 1827)
1095. 山脉数组中查找目标值(Rating 1827)
以下内容偏向于记录个人练习过程及思考,非常规题解内容
题目
思路
显然二分。
首先二分找到山脉峰值
接着分别二分前后找到目标值
二分找山峰的地方没有想出来,关键思路:
二分过程中比较mid和mid+1对应的值
- 如果mid的值小于mid+1的值,那么山峰肯定在mid+1及其右边
- 如果mid的值大于mid+1的值,那么山峰肯定在mid及其左边
代码
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
# """
# 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()
# find peak
l, r = 0, n - 1
while l < r: # 因为要比较mid和mid+1的值,所以这里不能取等
m = (l + r) // 2
m0_num = mountainArr.get(m)
m1_num = mountainArr.get(m + 1)
if m0_num < m1_num:
l = m + 1
else:
r = m
peak_idx = l # 找到峰值
# find left
l, r = 0, peak_idx
while l <= r:
m = (l + r) // 2
m_num = mountainArr.get(m)
if m_num == target:
return m
if m_num > target:
r = m - 1
else:
l = m + 1
# find right
l, r = peak_idx, n - 1
while l <= r:
m = (l + r) // 2
m_num = mountainArr.get(m)
if m_num == target:
return m
if m_num > target:
l = m + 1
else:
r = m - 1
return -1
本文由作者按照 CC BY 4.0 进行授权