山脉数组中查找目标值

image.png

今天的每日一题。虽然是困难题,但是想到怎么做了,难度就变成简单题了。

因为是山脉数组,数组中存在一个递增和一个递减序列,所以目标可能在任意一个序列内。

首先查找山峰在哪里,这是两个序列的分界点。既然要查找山峰肯定是二分查找,不然这个题不如直接遍历来的快。 我们可以根据中间位置的单调性来判断左边是不是包含山峰。比如如果
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

北语张益达
6 声望4 粉丝