力扣(leetcode) 852. 山脉数组的峰顶索引(一行代码解决)(二分法)

本文介绍了如何解决LeetCode上的‘山脉数组中找到峰值元素’问题,通过两种方法:一行代码利用库函数和二分查找算法。详细解释了二分查找的适用条件和实现细节,帮助读者理解并掌握此问题的解决方案。同时提供了相关二分查找文章链接以供深入学习。
摘要由CSDN通过智能技术生成

题目在这:https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/

题目分析:

题目一堆数学符号看着难受。给大家解答一下,就是给了一堆数组,其中有一个数X ,这个数的左边和右边的所有数都比他小,所以这个数组叫山脉数组,而这个数X就是山峰。

害,说了这么多不就是找最大值吗?

法一:

巧妙利用库函数解决问题。只需一行代码。

return  arr.index(max(arr))

max不用解释了吧,列表里找最大值
index() 方法返回列表中匹配到的第一个数的下标~

法二:

显然可以二分法寻找最大值,毕竟这周二分法周~每日一题全是二分法。

思路分析:
本题和普通二分法有一点区别,就是不知道要找的那个数是什么。
所以需要明确条件。
举个例子:
数组 arr=[1,3,5,4,2] 。显然数组a[0] < a[1] ,山顶点为a[2] = 5.
在山顶点的右边 a[3]>a[4]。
很清晰的得出结论。
当a[i] < a[i+1]时,山顶点在a[i] 的右边。
同理,当a[i] > a[i+1]时,山顶点在a[i] 的左边。

还有一点就是,该山峰数组的山顶,也就是我们要找的那个最大值,一定不在开头和结尾,所以设置left和right的时候记得避开。

上面两点明白了代码就很容易出来了。

l = 1 # 避开开头
r = len(arr) - 2  # 避开结尾
while l < r:
    mid = (r+l) // 2
    if arr[mid] < arr[mid+1]: # 说明此时 顶点在右边 缩小范围去右边找
        l = mid + 1
    else:	# 此时顶点在左边 缩小范围去左边找
        r = mid
return l 

在这里插入图片描述

有关二分法的详细解析,看我另一篇文章,保证让你不惧任何二分法。
https://blog.csdn.net/qq_38737428/article/details/117903312?spm=1001.2014.3001.5501

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深度不学习!!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值