派森 #P122. 峰值查找

描述

给定一个长度为n的列表nums,请你找到峰值并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个所在位置即可。 (1)峰值元素是指其值严格大于左右相邻值的元素。严格大于即不能有等于; (2)列表两个边界可以看成是最小,nums[0]=nums[-1]= −∞ (3)对于所有有效的 i 都有 nums[i] != nums[i + 1]。 

图片

 

样例

输入

2 4 1 2 7 8 4

输出

5

代码:

nums = []
s = input().split(' ')
for x in s:
    nums.append(float(x))
left, right = 0, len(nums) - 1
while left < right:
    mid = (left + right) // 2
    if nums[mid] > nums[mid + 1]:
        right = mid
    else:
        left = mid + 1
print(left)

代码解析:

  1. nums = []:定义一个空列表,用于存储输入的数字列表。
  2. s = input().split(' '):通过input()函数获取用户输入的一行字符串,并使用split(' ')方法将其拆分成一个字符串列表。默认情况下,split()方法使用空格作为分隔符来拆分字符串。
  3. for x in s::对字符串列表s进行迭代,将迭代的值依次赋给变量x。
  4. nums.append(float(x)):将字符串x转换为浮点数类型,并将其添加到nums列表中。
  5. left, right = 0, len(nums) - 1:同时为变量left和right赋初值。left表示当前搜索范围的左边界,初始为0;right表示当前搜索范围的右边界,初始为列表的最后一个索引。
  6. while left < right::当left小于right时,执行循环体内的代码。这表示搜索范围还没有缩小到只有一个元素。
  7. mid = (left + right) // 2:计算当前搜索范围的中间位置的索引。使用整数除法(//)确保mid是整数。
  8. if nums[mid] > nums[mid + 1]::比较mid位置上的元素值与其右边相邻元素的值。如果mid位置上的元素值大于右边相邻元素的值,说明峰值在mid的左边,将搜索范围缩小到[left, mid]。
  9. right = mid:将搜索范围的右边界更新为mid位置,因为nums[mid]已经不可能是峰值,可以排除掉。
  10. else::如果mid位置上的元素值小于或等于右边相邻元素的值,说明峰值在mid的右边,将搜索范围缩小到[mid+1, right]。
  11. left = mid + 1:将搜索范围的左边界更新为mid + 1,因为mid位置上的元素值已经被排除。
  12. print(left):打印最终得到的峰值的索引,即left的值。

利用了二分查找的思想来寻找峰值。通过不断缩小搜索范围,每次将搜索范围减半,直到找到峰值所在的位置。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自适应峰值检测算法是一种用于信号处理和数据分析的常见算法。以下是在MATLAB中实现自适应峰值检测算法的一般步骤: 1. 对输入信号进行预处理:例如,使用高通滤波器去除低频噪声。 2. 计算信号的局部极大值:使用MATLAB中的 findpeaks 函数查找信号中的峰值,并记录它们的幅度、位置和宽度。 3. 计算信号的峰值阈值:根据信号的峰值统计信息,使用自适应算法计算信号的峰值阈值。 4. 选择真正的峰值:将局部极大值与峰值阈值比较,选择真正的峰值。 以下是一个示例代码,演示了如何在MATLAB中实现自适应峰值检测算法: ```matlab % 生成测试信号 fs = 1000; % 采样率 t = linspace(0,1,fs); x = sin(2*pi*50*t) + randn(size(t)); % 预处理:使用高通滤波器去除低频噪声 fc = 40; % 截止频率 [b,a] = butter(6,fc/(fs/2),'high'); x = filter(b,a,x); % 计算局部极大值 [pks,locs,w] = findpeaks(x,'MinPeakDistance',50); % 计算峰值阈值 p = 0.5; % 阈值系数 n = length(x); % 信号长度 m = round(n/10); % 统计窗口长度 h = zeros(size(x)); % 峰值阈值 for i = 1:length(x) if i <= m h(i) = p * max(x(1:i)); elseif i >= n-m h(i) = p * max(x(i:end)); else h(i) = p * max(x(i-m:i+m)); end end % 选择真正的峰值 idx = pks > h(locs); pks = pks(idx); locs = locs(idx); w = w(idx); % 绘制结果 plot(t,x) hold on plot(t(locs),pks,'ro') hold off ``` 在这个示例中,我们首先生成了一个包含噪声的正弦信号,并使用高通滤波器去除低频噪声。然后,我们使用MATLAB中的 findpeaks 函数计算信号的局部极大值,记录它们的幅度、位置和宽度。接下来,我们使用自适应算法计算信号的峰值阈值,并将局部极大值与峰值阈值比较,选择真正的峰值。最后,我们绘制了信号和检测到的峰值

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值