1095、山脉数组中查找目标值

  1. 1095、山脉数组中查找目标值
    1. 示例 1:
    2. 示例 2:
      1. 提示:
  2. 题解
    1. 1、二分查找

1095、山脉数组中查找目标值

这是一个 交互式问题 )

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

输入:array = [1,2,3,4,5,3,1], target = 3
输出:2
解释:3 在数组中出现了两次,下标分别为 2 和 5,我们返回最小的下标 2。

示例 2:

输入:array = [0,1,2,4,2,1], target = 3
输出:-1
解释:3 在数组中没有出现,返回 -1。

提示:

  • 3 <= mountain_arr.length() <= 10000
  • 0 <= target <= 10^9
  • 0 <= mountain_arr.get(index) <= 10^9

链接:https://leetcode-cn.com/problems/find-in-mountain-array

题解

1、二分查找

/**
 * // This is MountainArray's API interface.
 * // You should not implement it, or speculate about its implementation
 * interface MountainArray {
 *     public int get(int index) {}
 *     public int length() {}
 * }
 */
 
class Solution {
    public int findInMountainArray(int target, MountainArray mountainArr) {
        // 二分搜索找到 peak
        int n = mountainArr.length();
        int peak = findPeak(0, n - 1, mountainArr);
        int leftRes = binarySearchLeft(target, 0, peak, mountainArr);
        if (leftRes != -1) return leftRes;  // 左半边有结果直接返回
        // 左半边搜不到,再看右半边
        int rightRes = binarySearchRight(target, peak + 1, n - 1, mountainArr);
        return rightRes;
    }

    // 先找到山顶的索引位置
    public int findPeak(int left, int right, MountainArray mountainArr){
        while (left < right){
            int mid = left + (right - left) / 2;
            if (mountainArr.get(mid) < mountainArr.get(mid + 1)) // 当前 mid 比右边小,mid 一定不是 peak
                left = mid + 1;
            else right = mid;
        }
        // 退出的时候 left = right
        return left;

    }
    // 左半边有序数组 找 target,最简单的二分搜索 while 里面的条件是 left <= right
    public int binarySearchLeft(int target, int left, int right, MountainArray mountainArr){
        while (left <= right){
            int mid = left + (right - left) / 2;
            if (target == mountainArr.get(mid)) return mid;
            else if (target < mountainArr.get(mid)) right = mid - 1;
            else left = mid + 1;
        }
        return -1;
    }
    // 右半边有序数组 找 target
    public int binarySearchRight(int target, int left, int right, MountainArray mountainArr){
        while (left <= right){
            int mid = left + (right - left) / 2;
            if (target == mountainArr.get(mid)) return mid;
            else if (target < mountainArr.get(mid)) left = mid + 1;
            else right = mid - 1;
        }
        return -1;
    }
}

// 作者:kelly2018
// 链接:https://leetcode-cn.com/problems/find-in-mountain-array/solution/java-san-ci-er-fen-by-kelly2018/

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 1056615746@qq.com

💰

Title:1095、山脉数组中查找目标值

Count:750

Author:攀登

Created At:2020-07-26, 00:19:44

Updated At:2024-06-15, 15:52:32

Url:http://jiafeimao-gjf.github.io/2020/07/26/1095%E3%80%81%E5%B1%B1%E8%84%89%E6%95%B0%E7%BB%84%E4%B8%AD%E6%9F%A5%E6%89%BE%E7%9B%AE%E6%A0%87%E5%80%BC/

Copyright: 'Attribution-non-commercial-shared in the same way 4.0' Reprint please keep the original link and author.

×

Help us with donation