滑动窗口的最大值

每天学一点,今天解决的是剑指offer的剑指 Offer 59 - I. 滑动窗口的最大值。
输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7]
滑动窗口的位置 最大值


[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

可以用暴力法强行破解,但是复杂度无法保证,因此可以考虑滑动窗口,在滑动窗口的思路。
我开始想到每次滑动后都将窗口内的元素进行排序为递减序列,弹出队首作为该滑动窗口的最大值,但是一旦进行排序,就会打乱顺序,那么我怎么保证滑动窗口进行移动时弹出哪个元素?
因此,我们的队列需要满足两个要求

  1. 队首为该滑动序列的最大值
  2. 排序后的队列在滑动窗口移动时不需要考虑弹出的元素顺序被打乱。
    根据这些特点,单调的双向队列可以满足我们。
    其特点为,整个队列是单调递减的,队首元素为当前元素最大值。

为什么需要双向队列?需要对队伍两端进行操作,为什么要对队伍两端进行操作因为

  1. 队首删除是因为滑动窗口的长度已经过长了,需要对队首元素进行删除操作。
  2. 队尾删除是因为新插入的元素比队尾的元素大,为了维持队伍的单调性,因此需要删除队尾元素把新插入的元素加上

这样队伍的元素顺序就与所给数组的元素相对顺序相同,且从大到小进行排序,具体到代码如下。

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
       int n =nums.size();
       if(n<k || k<=0)
       return {};//防止传入错误的参数
        int low = 1-k,high = 0;
        deque<int> dp;
        vector<int> res;

        while(high < n ){
            //  判断滑窗的low是否为最大元素
            if(low >= 1 && nums[low -1] == dp[0])/滑动窗口太长了或者左端就是最大元素
            dp.pop_front();//删掉队首

            while(!dp.empty() && dp[0]<nums[high])
            dp.pop_front();//小于nums[high]都删掉
            while(!dp.empty() && dp[dp.size()-1]<nums[high])
            dp.pop_back();//清空比nums[high]小的元素
            dp.push_back(nums[high]);//插入nums[high]

            if(low >=0)//如果low>=0说明已经是一个完整的滑动窗口了
            res.push_back(dp[0]);//插入队首元素
            low++;
            high++;


        }
return res;
        


    }
};
python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值