寻找峰值【刷题记录】及range使用说明

一 、题目描述:

山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组nums,任意两个相邻元素值不相等,数组可能包含多个山峰。找到索引最大的那个山峰元素并返回其索引。
假设 nums[-1] = nums[n] = -∞。
示例
输入:[2,4,1,2,7,8,4]
返回值:5

二、 思路:优化!!

若从右往左遍历,当下标index处的值不是峰值时,其必满足

在这里插入图片描述

,所以当检测index-1处是否为峰值时只需要与左边的值进行比较。
在这里插入图片描述

需要注意的是:

1,寻找的是最大的索引,不是最大值的索引 2,右边没有值也算峰(也就是第一个判断返回)

减少循环次数
1、 最后一个值是符合的直接返回
2、 有峰值时要跳,因为有峰值的下一个必定不是峰值
3、 从索引1开始到倒数时第二个索引

三、解题代码

class Solution:
    def solve(self , a ):
        # write code here
        ##倒序遍历
        for i in range(len(a)-1, -1, -1):
            # a[i] > a[i-1] 即为最大索引峰值
            if a[i] > a[i-1]:
                return i
        # 如果没有则返回数组最后位的索引
        return len(a)-1

或者

class Solution:
    def solve(self , a ):
        # write code here
        if len(a) ==0:
            return -1
        i = len(a) - 1
        while i < len(a):
            if (a[i] >= a[i-1]):
                return i
                #break
            else:
                i = i - 1

注: range(len(a)-1, -1, -1)为从最大索引峰值步长为1倒着遍历到-1结束

复杂度分析
1 时间复杂度O(N):N表示数组的长度,遍历一遍数组时间O(N)

2\空间复杂度O(1):仅使用常数级变量空间

range使用说明:

range(start, stop[, step])
参数说明: start: 计数从 start 开始。默认是从 0 开始。

例如

range(5)等价于range(0, 5);
stop: 计数到 stop 结束,但不包括 stop。

range(0, 5) 是[0, 1, 2, 3, 4]没有5, step:步长,默认为1。

range(0, 5) 等价于 range(0, 5, 1)

range(10) # 从 0 开始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

range(1, 11) # 从 1 开始到 11
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

range(0, 30, 5) # 步长为 5
[0, 5, 10, 15, 20, 25]

range(0, 10, 3) # 步长为 3
[0, 3, 6, 9]

range(0, -10, -1) # 负数
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

range(0)
[]

range(1, 0)
[]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值