一 、题目描述:
山峰元素是指其值大于或等于左右相邻值的元素。给定一个输入数组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)
[]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/99765.html