avatar

Catalog
山脉数组中查找目标值

题目描述

(这是一个 交互式问题 )

给你一个 山脉数组 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

代码

Code
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)
Author: kim yhow
Link: http://yoursite.com/2020/04/29/山脉数组中查找目标值/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶