852.Peak Index in a Mountain Array

本文探讨了山形数组峰顶索引的快速查找算法,对比了线性搜索与折半查找两种方法。介绍了折半查找的递归与非递归实现,其时间复杂度从O(n)降低至O(log(n)),显著提升了效率。

Let's call an array A a mountain if the following properties hold:

  • A.length >= 3
  • There exists some 0 < i < A.length - 1 such that A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1]

Given an array that is definitely a mountain, return any i such that A[0] < A[1] < ... A[i-1] < A[i] > A[i+1] > ... > A[A.length - 1].

Example 1:

Input: [0,1,0]
Output: 1

Example 2:

Input: [0,2,1,0]
Output: 1

Note:

  • 3 <= A.length <= 10000
  • 0 <= A[i] <= 10^6
  • A is a mountain, as defined above.
class Solution {
    public int peakIndexInMountainArray(int[] A) {
        int i;
        for(i =0;i<A.length-1;i++){
            if(A[i]<A[i+1]) continue;
            else break;
        }
        return i;
        
    }
}

初看这道题,觉得这道题简单的离谱。但是,上述代码的效果并不好。

Runtime: 3 ms, faster than 38.95% of Java online submissions for Peak Index in a Mountain Array.

这种直接的方法的时间复杂度为O(n)。那么有没有更快的算法呢?显然是有的。

 

折半查找(递归):

class Solution {
    public int peakIndexInMountainArray(int[] A) {
        return Middle(A,0,A.length -1);
    }
    
    public int Middle(int[] A, int left, int right){
        int mid = (left+right)/2;
        if(left != right){
             if(A[mid] > A[mid+1])
                return Middle(A,left,mid);
             else 
                return Middle(A,mid+1,right);
        } 
        else return mid;
    }
    
}

时间复杂度为O(log(n))。

 

折半查找(非递归):

class Solution {
    public int peakIndexInMountainArray(int[] A) {
       int left = 0;
       int right = A.length - 1;
        while(left<right){
            int mid = (left + right)/2;
            if(A[mid]<A[mid+1])
                left = mid+1;
            else
                right = mid;
        }
        return left;
    }
    
}

这道题,看似简单,实际上,第一个想到折半查找的人并不多。

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
内容概要:本文系统阐述了企业新闻发稿在生成式引擎优化(GEO)时代下的全渠道策略与效果评估体系,涵盖当前企业传播面临的预算、资源、内容与效果评估四大挑战,并深入分析2025年新闻发稿行业五大趋势,包括AI驱动的智能化转型、精准化传播、首发内容价值提升、内容资产化及数据可视化。文章重点解析央媒、地方官媒、综合门户和自媒体四类媒体资源的特性、传播优势与发稿策略,提出基于内容适配性、时间节奏、话题设计的策略制定方法,并构建涵盖品牌价值、销售转化与GEO优化的多维评估框架。此外,结合“传声港”工具实操指南,提供AI智能投放、效果监测、自媒体管理与舆情应对的全流程解决方案,并针对科技、消费、B2B、区域品牌四大行业推出定制化发稿方案。; 适合人群:企业市场/公关负责人、品牌传播管理者、数字营销从业者及中小企业决策者,具备一定媒体传播经验并希望提升发稿效率与ROI的专业人士。; 使用场景及目标:①制定科学的新闻发稿策略,实现从“流量思维”向“价值思维”转型;②构建央媒定调、门户扩散、自媒体互动的立体化传播矩阵;③利用AI工具实现精准投放与GEO优化,提升品牌在AI搜索中的权威性与可见性;④通过数据驱动评估体系量化品牌影响力与销售转化效果。; 阅读建议:建议结合文中提供的实操清单、案例分析与工具指南进行系统学习,重点关注媒体适配性策略与GEO评估指标,在实际发稿中分阶段试点“AI+全渠道”组合策略,并定期复盘优化,以实现品牌传播的长期复利效应。
以下是修改后的代码,添加了画图过程。在每次处理完一行数据后,绘制滤波前后的信号以及找到的峰值点。 ```python import numpy as np from scipy.signal import find_peaks, butter, filtfilt from scipy.io import savemat import matplotlib.pyplot as plt # 加载.npy文件 data = np.load('ch1_data.npy') # 滤波参数设置(Butterworth低通滤波器) fs = 3200_000_000 # 3.2 GHz cutoff = 5000_000 # 截止频率为5 MHz nyquist = 0.5 * fs normal_cutoff = cutoff / nyquist order = 4 # 滤波器阶数 # 创建Butterworth低通滤波器 b, a = butter(order, normal_cutoff, btype='low', analog=False) # 初始化存储结果的列表 peak1_list = [] peak2_list = [] peak3_list = [] peaks_list = [] # 遍历每一组数据 (5000行,每行1024个数据) for idx, row in enumerate(data): # 对当前行数据进行滤波 filtered_row = filtfilt(b, a, row) # 查找峰值 peaks, _ = find_peaks(filtered_row, height=0) # 根据需求调整height阈值 num_peaks = len(peaks) # 绘制原始信号、滤波后信号及找到的峰值 plt.figure(figsize=(12, 6)) plt.subplot(2, 1, 1) plt.plot(row, label="Original Signal", color="blue") plt.title(f"Row {idx} - Original Signal") plt.legend() plt.subplot(2, 1, 2) plt.plot(filtered_row, label="Filtered Signal", color="green") plt.plot(peaks, filtered_row[peaks], "x", label="Peaks", color="red") plt.title(f"Row {idx} - Filtered Signal with Peaks (Num Peaks: {num_peaks})") plt.legend() plt.tight_layout() plt.show() # 根据峰值数量分类保存 if num_peaks == 1: peak1_list.append(row) # 保存原始数据或滤波后的数据 elif num_peaks == 2: peak2_list.append(row) elif num_peaks == 3: peak3_list.append(row) else: # 峰值数量大于等于4 peaks_list.append(row) # 将分类好的数据保存为npy文件 np.save('peak1.npy', np.array(peak1_list)) np.save('peak2.npy', np.array(peak2_list)) np.save('peak3.npy', np.array(peak3_list)) np.save('peaks.npy', np.array(peaks_list)) savemat('peaks.mat', {'peaks': peaks_list}) print("处理完成!") ``` ### 上述代码解释: 1. **加载数据**:使用`np.load`加载`.npy`文件中的数据。 2. **滤波器设计**:通过`butter`函数设计一个4阶Butterworth低通滤波器,截止频率为5 MHz。 3. **滤波处理**:对每一行数据使用`filtfilt`进行零相位滤波,以避免相位失真。 4. **峰值检测**:使用`find_peaks`函数查找滤波后信号中的峰值,并根据峰值数量分类保存到不同列表中。 5. **绘图**: - 使用`matplotlib`库绘制两幅子图: - 第一幅子图显示原始信号。 - 第二幅子图显示滤波后的信号及找到的峰值点。 - 每次处理完一行数据后都会弹出一个窗口显示图形。 6. **保存结果**:将分类后的数据保存为`.npy`文件和`.mat`文件。 ### 注意事项: - 如果数据量较大(如5000行),每次绘制图形可能会导致程序运行较慢。可以考虑每隔若干行绘制一次图形,或者仅绘制部分行的图形。 - `height=0`可以根据实际需求调整为合适的阈值,以过滤掉不感兴趣的较小峰值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值