壹 ❀ 引

本题来自LeetCode 852. 山脉数组的峰顶索引,难度依旧是简单,也是一道考二分法的题目,题目描述如下:

符合下列属性的数组 arr 称为 山脉数组 :

arr.length >= 3

存在 i(0 < i < arr.length - 1)使得:

arr[0] < arr[1] < ... arr[i-1] < arr[i]

arr[i] > arr[i+1] > ... > arr[arr.length - 1]

给你由整数组成的山脉数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i - 1] < arr[i] > arr[i + 1] > ... > arr[arr.length - 1] 的下标 i 。

示例 1:

输入:arr = [0,1,0]
输出:1

示例 2:

输入:arr = [0,2,1,0]
输出:1

示例 3:

输入:arr = [0,10,5,2]
输出:1

示例 4:

输入:arr = [3,4,5,1]
输出:2

示例 5:

输入:arr = [24,69,100,99,79,78,67,36,26,19]
输出:2

提示:

3 <= arr.length <= 104

0 <= arr[i] <= 106

题目数据保证 arr 是一个山脉数组

贰 ❀ 暴力解法

根据题目,我们会得到一个代表峰顶高度的山脉数组,每一个数字都可以表示一座山峰的高度,而题目要求就是要找到某个山峰数,满足它左侧的山都比它低,同时满足它右侧的山也都比它低,返回这个山脉的索引。

我一想,这难道不就是要找到数组最大值的索引吗?毕竟数组最大数的左右两侧注定会都小于它,盘它:

var peakIndexInMountainArray = function(arr) {
// 找到最大数的索引?
let max = Math.max(...arr);
return arr.indexOf(max);
};

直接点击提交,这个思路还真给过了。但从时间复杂度来说,假设最高的山峰是数组最后一位,最坏的情况就是O(n)

叁 ❀ 二分法思路

OK,让我们在看看二分法的思路。其实题目要求有点没说清,所谓保证arr是一个山脉数组,其实意思就是一定是个数字先升后降低的数组,啥意思呢?山脉数组是图1这样的,而不是图2这样的:

所以像[1,2,1],[1,2,3,5,4,1]这种都是山脉数组,它只有一个山峰,只有一个最高点。而像[1,2,1,2]这类数组就都不是山脉数组,很明显它存在了多个山峰。

因此我们假定取数组中间数mid,它存在三种情况。

第一种,在上升区域,此时arr[mid]<arr[mid+1],那说明最高峰肯定还没到啊,所以此时应该调整左边界,让l=mid+1,为什么加1?因为不可能是mid啊,不需要考虑它了,直接跳过加个1。

第二种,好巧不巧,正好mid是山顶,那么此时arr[mid]>arr[mid+1],且arr[mid]>arr[mid-1]

第三种,取在了下坡区域,此时满足arr[mid]>arr[mid+1]。但是很明显此时mid并不是最高,结合第二种,综合发现当arr[mid]>arr[mid+1]时,它可能是最高,也可能最高还在左侧,保险起见,此时应该调整右边界,也就是r = mid。为什么不减1?因为可能是第二种情况啊,减1直接好家伙,把山峰给排除了。

所以结合来说,我们只需要根据第二种跳出循环,其余情况不断调整左右边界,最后一定会找到符合条件的数字,题目不是都说了,一定是个山脉数组,所以直接实现代码:

var peakIndexInMountainArray = function (arr) {
// 定义左右边界
let l = 0, r = arr.length - 1;
// 这里不用加=,因为指针还没重合前一定会找到最高的山峰
while (l < r) {
let mid = Math.floor(l + (r - l) / 2);
// 如果是第二种情况,直接跳出循环
if (arr[mid] > arr[mid + 1] && arr[mid] > arr[mid - 1]) {
return mid;
};
// 二 三种情况,跳转右边界
if (arr[mid] > arr[mid + 1]) {
r = mid;
} else {
// 反之调整左边界
l = mid + 1;
}
}
};

应该很清晰了,本题结束。

JS Leetcode 852. 山脉数组的峰顶索引图解分析,高高的山峰一起吹山风吧。的更多相关文章

  1. LeetCode 852. 山脉数组的峰顶索引 (二分)

    题目链接:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/ 我们把符合下列属性的数组 A 称作山脉: A.length ...

  2. Leetcode之二分法专题-852. 山脉数组的峰顶索引(Peak Index in a Mountain Array)

    Leetcode之二分法专题-852. 山脉数组的峰顶索引(Peak Index in a Mountain Array) 我们把符合下列属性的数组 A 称作山脉: A.length >= 3 ...

  3. 力扣(LeetCode) 852. 山脉数组的峰顶索引

    我们把符合下列属性的数组 A 称作山脉: A.length >= 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < ... A[i-1] ...

  4. LeetCode 852. Peak Index in a Mountain Array (山脉数组的峰顶索引)

    题目标签:Binary Search 题目给了我们一组 int array,让我们找到数组的 peak. 利用 binary search, 如果数字比它后面那个数字小,说明还在上坡,缩小范围到右半边 ...

  5. [Swift]LeetCode852. 山脉数组的峰顶索引 | Peak Index in a Mountain Array

    Let's call an array A a mountain if the following properties hold: A.length >= 3 There exists som ...

  6. LeetCode:寻找数组的中心索引【668】

    LeetCode:寻找数组的中心索引[668] 题目描述 给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和 ...

  7. Java实现 LeetCode 724 寻找数组的中心索引(暴力)

    724. 寻找数组的中心索引 给定一个整数类型的数组 nums,请编写一个能够返回数组"中心索引"的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧 ...

  8. 力扣(LeetCode)寻找数组的中心索引 个人题解

    给定一个整数类型的数组 nums,请编写一个能够返回数组“中心索引”的方法. 我们是这样定义数组中心索引的:数组中心索引的左侧所有元素相加的和等于右侧所有元素相加的和. 如果数组不存在中心索引,那么我 ...

  9. 【LeetCode】1095. 山脉数组中查找目标值 Find in Mountain Array

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 二分查找 日期 题目地址:https://leetco ...

  10. LeetCode 941. Valid Mountain Array (有效的山脉数组)

    题目标签:Array 题目给了一组int array A,让我们判断它是否是 一个山脉数组. 山脉数组一定要有一个最高值,然后要同时有 山坡和下坡. 想法是,从左边开始依次比较两个数字,int[0] ...

随机推荐

  1. 基于python的视频点播网站(python+django+vue开发的视频点播网站-视频管理系统)

    演示地址 前台地址: http://video.gitapp.cn 后台地址:http://video.gitapp.cn/admin 后台管理帐号: 用户名:admin123 密码:admin123 ...

  2. spring-transaction源码分析(1)概述和事务传播级别

    spring-tx概述 spring-tx包使用注解驱动和AOP通知将事务开启.提交/回滚.以及复杂的传播机制封装了起来,开发者不再需要编写事务管理的代码,而是可以只关注自己的业务逻辑. 本文将简单介 ...

  3. 【SHELL】查找包含指定字符串的目录、在找出的路径中找出指定格式的文件、并统计出数量

    查找包含字符串"skull"的目录.在找出的路径中找出格式".c/.cpp/.h"的文件.并统计出数量 find . -path ./out -prune -o ...

  4. 【Git】如何在github上提交PR(Pull Request)

    [来源]https://mp.weixin.qq.com/s/yHQRjpVeZVV4PuoUKM0FSw

  5. web - 解决 formdata 打印空对象

    获取单个值可以使用formData对象.get();而直接打印是看不到的.因为外界访问不到,你使用append方法后,对应的键值对就已经添加到表单里面了,你在控制台看到的是FormData原型,存储的 ...

  6. [转帖]GC日志解读,这次别再说看不懂GC日志了

    https://juejin.cn/post/7029130033268555807   测试环境:机器内存16G,JDK 8,12核CPU 测试用例,从网上找的示例,视情况修改即可:   java ...

  7. [转帖]Oracle-UNDO篇

      原文地址:https://www.modb.pro/db/70802?xzs= 一:请描述什么是Oracle Undo. 二:请描述UNDO的作用. 三:请谈谈你对Manual Undo Mana ...

  8. tiup 工具离线安装与简单导出数据说明

    tiup 工具离线安装说明 mirror的创建 能上网的机器上面进行如下操作: curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pi ...

  9. [转帖]使用 TiUP cluster 在单机上安装TiDB

    https://zhuanlan.zhihu.com/p/369414808   TiUP 是 TiDB 4.0 版本引入的集群运维工具,TiUP cluster 是 TiUP 提供的使用 Golan ...

  10. [转帖]最全MySQL锁讲解:页锁、共享锁、行锁、表锁、悲观锁、乐观锁

    我们在操作数据库的时候,可能会由于并发问题而引起的数据的不一致性(数据冲突),如何保证数据并发访问的一致性.有效性,是所有数据库必须解决的一个问题,锁的冲突也是影响数据库并发访问性能的一个重要因素,从 ...