首页 > 其他分享 >239. 滑动窗口最大值

239. 滑动窗口最大值

时间:2024-08-23 12:26:46浏览次数:9  
标签:deque nums int 最大值 queue 队列 239 滑动

题目描述

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

返回 滑动窗口中的最大值 。

解题思路

这里我们可以自己设计个队列,这个队列里面主体数据结构我们使用Java里的Deque这个双向队列,我们向这个队列里放入元素的时候我们的原则是只维持队列里面最大的元素在我们这个双向队列的头部位置,当我们的滑动窗口向后滑动的时候,如果此时我们要弹出的元素不是队列的头部元素我们就直接跳过(说明在此前添加进来的时候就被pass掉了),如果我们此时要弹出的元素是队列的头部元素,我们就要把头部元素弹出,然后向后依次遍历就可以了,主体思路就是我们只维持最大的元素在我们队列的头部就行了

import java.util.*;

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums.length == 1) {
            return nums;
        }
        List<Integer> result = new ArrayList<>();

        MyQueue queue = new MyQueue();

        for (int i = 0; i < k; i++) {
            queue.push(nums[i]);
        }
        result.add(queue.getMax());

        for (int j = k; j < nums.length; j++) {
            queue.pop(nums[j - k]);
            queue.push(nums[j]);
            result.add(queue.getMax());
        }

        int[] num = result.stream().mapToInt(Integer::intValue).toArray();
        return num;

    }

    class MyQueue {
        Deque<Integer> deque = new LinkedList<>();

        public void pop(int value) {
            if (!deque.isEmpty() && deque.getFirst() == value) {
                deque.pollFirst();
            }
        }
        
        public void push(int value) {
            while (!deque.isEmpty() && deque.getLast() < value) {
                deque.pollLast();
            }
            deque.addLast(value);
        }

        public int getMax() {
            return deque.getFirst();
        }

    }

}

标签:deque,nums,int,最大值,queue,队列,239,滑动
From: https://www.cnblogs.com/dfj-blog/p/18375756

相关文章

  • 《滑动窗口》定长滑动窗口
    LeetCode1456定长子串中元音的最大数目方法1:滑动窗口classSolution{publicintmaxVowels(Strings,intk){intn=s.length(),count=0,ans=0;for(inti=0;i<n;i++){count+=isVowel(s.charAt(i));if(......
  • 【TCP】核心机制:滑动窗口、流量控制和拥塞控制
    文章目录滑动窗口窗口滑动滑动窗口丢包流量控制拥塞控制窗口大小变化过程滑动窗口有一类算法题,就是通过滑动窗口的思想来解决的,算法中的“滑动窗口”借鉴自TCP的滑动窗口TCP是要保证可靠传输的==>代价,降低了传输的效率(重传,确认重传等操作)TCP希望能在可靠传输......
  • Mat的最大值、最小值
    学OpenCV================================================这里的行列对应y和x。 ================================================1#include<iostream>23#include<opencv2/opencv.hpp>4#include<opencv2/core/utils/logger.hpp>567......
  • echats鼠标滑动,连续修改点的位置
    定义图表myChart.value=markRaw(echarts.init(document.getElementById("theEcharts")));myChart.value.setOption(options.value);监听鼠标按下,监听鼠标移动,监听鼠标抬起//加条件判断,按下后滑动才能改变图表letetype=0myChart.value.getZr().on('m......
  • 编写类A01,定义方法max,实现求某个double数组的最大值,并返回
    1publicclassHomework01{23//编写一个main方法4publicstaticvoidmain(String[]args){5A01a01=newA01();6double[]arr={1,1.4,-1.3,89.8,123.8,66};//;{};7Doubleres=a01.max(arr);8if......
  • 题解:UVA12398 NumPuzz I
    题意给你一个操作顺序,每个字母代表一个格子的操作。每次操作都会将一个格子及它相邻的格子的值\(-1\),如果格子的值为\(0\),则会变成\(9\)。已知操作完成后的所有格子值都为\(0\),求最开始每个格子的值为多少。思路模拟过程。倒推出得出答案。如果原操作\(-1\),那么现操作在......
  • 数据结构与算法——滑动窗口
    目录引言核心思想使用场景解题步骤经典例题1、无重复字符的最长子串(LeetCode3)2、找到字符串中所有字母异位词(LeetCode438)引言定义:滑动窗口是指通过左右两个指针(或索引)来标记窗口的左右边界,随着指针的移动,窗口内的元素不断变化,从而实现对数组或字符串中连续子序列的......
  • 基于YOLOv8的通用的滑动验证码滑块缺口检测模型
    文章目录前言滑块缺口验证码验证码示例训练步骤总结前言首先放张图片表达此时的心情,同志们节日快乐!!!滑块缺口验证码滑动验证码滑块缺口的位置识别是破解滑块验证码的关键,这里我们尝试使用YOLOV8训练目标检测模型,识别出滑块图片的缺口验证码示例模型通过大批量......
  • day23-测试自动化之Appium的滑动和拖拽事件、高级手势ActionChains、手机操作API
    目录一、滑动和拖拽事件    1.1.应用场景    1.2.swipe滑动事件    1.3.scroll滑动事件    1.4.drag_and_drop拖拽事件    1.5.滑动和拖拽事件的选择二、高级手势ActionChains    2.1.应用场景    2.2.使用......
  • 0239-RLTK-分割不同文件
    环境Time2022-11-30WSL-Ubuntu22.04RLTK0.8.7前言说明参考:https://bfnightly.bracketproductions.com/rustbook目标基于前一节的内容,随着main.rs文件中的内容越来越多,将其进行分割。comp.rsuserltk::RGB;usespecs::prelude::*;usespecs_derive::Component;......