山脉数组中查找目标值
今天的每日一题。虽然是困难题,但是想到怎么做了,难度就变成简单题了。
因为是山脉数组,数组中存在一个递增和一个递减序列,所以目标可能在任意一个序列内。
首先查找山峰在哪里,这是两个序列的分界点。既然要查找山峰肯定是二分查找,不然这个题不如直接遍历来的快。 我们可以根据中间位置的单调性来判断左边是不是包含山峰。比如如果
mountainArr.get[mid]<mountainArr.get[mid+1]我们就可以判断左边(left,mid)一定不存在山峰。
找到了山峰后,问题就非常简单了,先去山峰左边查找,找不到再去右边,都找不到返回-1。
代码如下:
class Solution(object):
def findInMountainArray(self, target, mountain_arr):
"""
:type target: integer
:type mountain_arr: MountainArray
:rtype: integer
"""
left,right = 0,mountain_arr.length()-1
# 找山峰
while left<right:
mid = (left+right)//2
# 山峰不在左边 [0,mid]
if mountain_arr.get(mid)<mountain_arr.get(mid+1):
left = mid+1
else:
right = mid
mountain_top = left
# 如果在左边
left,right = 0,mountain_top
while left<right:
mid = (left+right)//2
# 不在左边
if mountain_arr.get(mid) < target:
left = mid+1
else:
right = mid
if mountain_arr.get(left) == target:
return left
# 如果在右边
left,right = mountain_top,mountain_arr.length()-1
while left<right:
mid = (left+right)//2
# 不在左边
if mountain_arr.get(mid) > target:
left = mid+1
else:
right = mid
return left if mountain_arr.get(left) == target else -1
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。