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个步骤

  1. 二分法找出峰值所在的下标,将数组划分为递增区间和递减区间
  2. 因为我们要找等于 target 最小 的下标 index 值,所以我们需要先在递增区间内找
  3. 然后再从递减区间内查找

代码

/*** // 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) {int l=0,r=mountainArr.length()-1;while(l<r){int mid=(r-l)/2+l;if(mountainArr.get(mid)<mountainArr.get(mid+1)){l=mid+1;}else r=mid;}int m=l;l=0;r=m;while(l<=r){int mid=(r-l)/2+l;if(mountainArr.get(mid)==target){return mid;}else if(mountainArr.get(mid)>target){r=mid-1;}else l=mid+1;}l=m+1;r=mountainArr.length()-1;while(l<=r){int mid=(r-l)/2+l;if(mountainArr.get(mid)==target){return mid;}else if(mountainArr.get(mid)<target){r=mid-1;}else l=mid+1;}return -1;}
}

1095. 山脉数组中查找目标值相关推荐

  1. LeetCode【每日一题】 1095. 山脉数组中查找目标值

    题目 1095. 山脉数组中查找目标值 (这是一个 交互式问题 ) 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 ...

  2. 巧妙利用二分查找:力扣1095. 山脉数组中查找目标值

    1.题目描述: 2.题解: 二分查找 思路: 对于山脉数组,可以看成两部分:前有序数组.后有序数组,分别是升序和降序有序 可以分为三步: 1.找山顶元素mountaintop(也就是最大值)的索引 2 ...

  3. LeetCode 1095. 山脉数组中查找目标值(二分查找)

    1. 题目 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值. 如果不存在这样的下标 ind ...

  4. 算法---LeetCode 1095. 山脉数组中查找目标值(二分法)

    1. 题目 原题链接 (这是一个 交互式问题 ) 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 inde ...

  5. 1095. 山脉数组中查找目标值(三分+二分)

    (这是一个 交互式问题 ) 给你一个 山脉数组 mountainArr,请你返回能够使得 mountainArr.get(index) 等于 target 最小 的下标 index 值. 如果不存在这 ...

  6. 1095.山脉数组中查找目标值

    链接:https://leetcode-cn.com/problems/find-in-mountain-array/ /*** * // This is the MountainArray's AP ...

  7. Leetcode每日一题:1095.find-in-mountain-array(山脉数组中查找目标值)

    思路:最多三次二分法:第一次先用二分法找出峰值,后两次依次对峰值左.右侧二分查找target 这种交互式问题 建议写个参数是数组的对应函数 测试下: class MountainArray {publ ...

  8. 16R-在数组中查找目标值

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引. 如果目标值不存在于数组中,返回它将会被按顺序插入的位置.你可以假设数 组中无重复元素. 示例 输入: [1,3,5,6], 5 输出: ...

  9. 34. 在排序数组中查找元素的第一个和最后一个位置给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标

    34. 在排序数组中查找元素的第一个和最后一个位置 难度中等2012 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target.请你找出给定目标值在数组中的开始位置和结束位置. 如果 ...

最新文章

  1. 智源论坛 | 知识与认知图谱(5月30日,活动报名)
  2. 关注 | 5G 和 WiFi-6,谁是智能制造的主角?
  3. 修改项目名称后,部署到tomcat问题
  4. 如何解决make: Nothing to be done for `all‘ 的方法
  5. 【深度学习入门到精通系列】U-net网络分析
  6. 关于vue使用eslint规范报Trailing Spaces not Allowed错误解决办法!
  7. .NET Remoting
  8. 今天,我们就来抽个奖!
  9. python如何写一个图片进去_python写个图片爬虫
  10. 操作系统原理与实践-2操作系统的引导
  11. linux修改默认python版本_Linux 升级 Python 并修改默认版本
  12. 链表的基本应用二及总结
  13. imx6 配置串口波特率_stm32异步串口(uart)通讯基本操作
  14. js cookie 的路径以及 Cookie 域
  15. 三星魔术师助手v5.3.1_Cinemachine 2.6为您带来精度,改进的工作流程和一点点魔术
  16. 我们分析了5万多场英雄联盟比赛,教你如何轻松用Python预测胜负
  17. matlab如何把正弦转化为余弦公式,余弦和正切的换算关系(正弦余弦正切转换公式大全)...
  18. 对象、对象的属性、对象字面量、枚举对象中的属性、可变类型、变量和对象——JS对象
  19. object标签属性详解
  20. 跳槽一次能涨多少,今天带你见识到跳槽天花板,涨薪80%

热门文章

  1. getsockname函数与getpeername函数的使用
  2. C++智能指针(二)模拟实现三种智能指针
  3. Linux进程通信之管道
  4. OPENSSL X509证书验证
  5. 【1】TCP三次握手的第三次的 ack包丢失会怎样?
  6. 做了6年的Java,mysql配置环境变量mac
  7. C#在WinForm中打开控制台显示
  8. 【CSS 技能提升】 :before和:after的使用
  9. linux命令-vim命令模式
  10. tcp http socket