hot100-滑动窗口

滑动窗口

题目描述:

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。

思路:

最开始的思路是使用动态规划,当新加入一个元素,新加入的元素如果大于原来窗口最大值,那就可以直接更新为当前窗口最大值,不用考虑左边元素出窗口的问题,否则需要考虑窗口最左边的元素,如果是这个元素等于上一个窗口的最大值,那就重新找当前窗口的最大值(利用冒泡),如果不等于,那说明元素的最大值仍旧在窗口内。

但是这样做为无法通过最后一个测试用例会超出时间限制,即数组中元素按照从大到小排序且多个重复元素,就会执行多次冒泡。

后面参考了题解的思路,

https://leetcode.cn/problems/sliding-window-maximum/solution/you-xian-dui-lie-zui-da-dui-dan-diao-dui-dbn9/

滑动窗口:

我们需要的数据结构:

尾部可插入与删除元素(排除普通队列),但是又需要能直接获取头部元素(排除栈),且需要删除头部元素

选用list来实现这种数据结构

每加入一个新元素时我们从队尾开始,若大于队尾元素则删除队尾元素,直至小于队尾元素才加入这个新元素(这些队尾元素值比当前元素小且在当前元素左边,不可能成为之后窗口的最大值,所以可以直接淘汰

那么list中元素就是按照从大到小排序,且右边的元素下标大于左边的元素下标。

当我们添加完新元素,需要找当前窗口最大值,就可以查看list中下标为0的元素,,若该元素下标小于当前窗口的左边界,可以删除该元素,知道下标为0的元素在窗口内,取该元素作为当前窗口最大值。(该元素之前的那些元素虽然值大,但是已经不在窗口内了,不可能再作为之后的窗口最大值,所以可以直接淘汰。)

代码:

if(k==1)return nums;
int[] res = new int[nums.length-k+1];
//存储元素下标,list中元素按照从大到小排列
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
   
    if(list.isEmpty()){
        //第一个元素直接添加
        list.add(i);
        continue;
    }
    if(nums[i]<nums[list.get(list.size()-1)]){
        //小于队尾元素则直接添加
        list.add(i);
    }else{
        //从队尾开始删除所有比当前元素小的元素然后再插入当前元素,
        // 这样就能保证list一定是降序排列,且当前元素成功插入list
        while((!list.isEmpty())&&nums[list.get(list.size()-1)]<=nums[i]){
            list.remove(list.size()-1);
        }
        list.add(i);
    }
    if(i>=k-1){
        //若i<k-1,说明窗口还没到k
        //否则判断list头部元素是否在窗口内,
        // 若在则直接作为当前窗口最大值,若不在则删除直至头部元素在窗口内
        int cur = i - k + 1;
        while(list.get(0)<cur){
            list.remove(0);
        }
        res[i-k+1] = nums[list.get(0)];
    }
}
return res;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LSTM(长短期记忆网络)是一种常用的循环神经网络结构,用于处理序列数据的建模和预测。在使用LSTM之前,通常需要对数据进行一些预处理。下面是一些LSTM数据处理的常用方法: 1. 数据归一化:将数据缩放到一个标准范围内,通常是[0, 1]或[-1, 1]。这可以通过使用最小-最大缩放或标准化方法来实现。 2. 序列化:将序列数据转换为可以输入LSTM模型的格式。通常,LSTM模型期望输入为三维张量,其形状为 [样本数,时间步长,特征数]。时间步长是指每个序列中的时间步数,而特征数是指每个时间步中的特征数。 3. 数据滑动窗口:将序列数据划分为滑动窗口,以创建输入和输出样本。滑动窗口可以通过定义窗口大小和步长来设置。窗口大小决定了每个样本的时间步长数,步长决定了滑动窗口之间的间隔。 4. 序列反转:在某些情况下,反转序列可以改善LSTM模型的性能。这是因为LSTM更容易捕捉到序列中的长期依赖关系。 5. 序列填充:如果序列的长度不一致,可以通过在序列的末尾添加填充值来使它们具有相同的长度。这可以通过使用填充函数或使用深度学习框架的内置函数来实现。 6. One-Hot编码:如果序列数据是分类数据,可以将其转换为One-Hot编码表示。One-Hot编码将每个类别转换为一个二进制向量,其中只有一个元素为1,其他元素为0。 7. 特征选择:对于具有大量特征的数据集,使用特征选择方法来减少输入特征的数量。这有助于降低计算成本并防止过拟合。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值