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

滑动窗口最大值

时间:2024-11-11 11:18:54浏览次数:1  
标签:peek 窗口 nums int 最大值 priorityQueue new 滑动

滑动窗口最大值

题目

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

返回 滑动窗口中的最大值

示例

示例 1:

输入: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

示例 2:

输入:nums = [1], k = 1
输出:[1]

思路

  • 可以使用优先队列,每个元素是一个两维数组,一个是元素的值,一个是元素的下标,重写他的排序规则,如果两个值不一样大,就按值排序,如果值一样大,就按下标排序,下标大的在前面,
  • 然后每访问一个元素,将元素加入进优先队列,然后从队列中将对头元素取出来,如果他的下标在 i - k + 1中,就是还在滑动数组范围内的,添加到结果集中,如果不在其中就将该元素弹出,取下一个对头元素。

代码实现

public int[] maxSlidingWindow(int[] nums, int k) {
    List<Integer> result = new ArrayList<>();
    PriorityQueue<int[]> priorityQueue = new PriorityQueue<>(new Comparator<int[]>() {
        @Override
        public int compare(int[] o1, int[] o2) {
            return o1[0] != o2[0] ? o2[0] - o1[0] : o1[1] - o2[1];
        }
    });
    for (int i = 0; i < k; i++ ) {
        priorityQueue.offer(new int[]{nums[i], i});
    }
    result.add(priorityQueue.peek()[0]);
    for (int i = k; i < nums.length; i++) {
        priorityQueue.offer(new int[]{nums[i], i});
        int[] peek = priorityQueue.peek();
        while (peek[1] < i - k + 1) {
            priorityQueue.poll();
            peek = priorityQueue.peek();
        }
        result.add(peek[0]);
    }
    return result.stream().mapToInt(i -> i).toArray();
}

标签:peek,窗口,nums,int,最大值,priorityQueue,new,滑动
From: https://www.cnblogs.com/wwgroup/p/18539350

相关文章

  • 代码随想录之滑动窗口、Java日期api、集合(11.4-11.11)
    代码1、长度最小的子数组⭐使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。 2、水果成篮自己想法:使用backet1和backet2表示篮子1和篮子2;使用backet1Account和backet2Account分别表示两个篮子里水果的数量,内层循环将i指针......
  • windows环境下cmd窗口打开就进入到对应目录,一般人都不知道~
    前言很久以前,我还在上一家公司的时候,有一次我看到我同事打开cmd窗口的方式,瞬间把我惊呆了。原来他打开cmd窗口的方式,不是一般的在开始里面输入cmd,然后打开cmd窗口。而是另外一种方式。我这个同事是个技术控,喜欢研究新的技术,研究一些提高效率的小窍门。这一方面,我看来还是要向他......
  • 实现qt 窗口无边框拖拽
    无边框拖拽是参考Qt实战6.万能的无边框窗口(FramelessWindow)-Qt小罗-博客园的文章,对其代码进行修改而来。本篇一共会提供本人写的无边框的代码以及Qt实战6.万能的无边框窗口(FramelessWindow)-Qt小罗-博客园里面的完整代码供大家参考.代码使用的话,我是直接让widget继承于fr......
  • AnimateDiff:一款强大的制作丝滑动画视频插件,轻松让你的图片动起来
    得益于StableDiffusion的开源,目前很多开发者推出了基于SD生成动画和视频的应用技术和扩展插件,在众多的技术中,AnimateDiff插件以“效果丝滑、稳定、无闪烁”等特性,成为目前Stablediffusion中效果最好的生成动画视频插件之一。今天就给大家详细介绍一下在Stablediffusion中......
  • # 爬虫应用 # 可视化窗口加爬虫 # 音频 # 批量 # tkinter #DrissionPage
    所用工具:pycham所需库:re,requests,tkinter,DrissionPage应用场景:DOUYING-PI-LIANG-HUA-CAI-JI  和 DAN-GE-CAI-JI在代码运行前确保库都导入完全和图片的下载;和图片路径正确;把下面图片下载,之后查看其路径,然后把源代码上的路径替换。img=tk.PhotoImage(file="D:\\01PY......
  • (Lin的实施运维笔记06)解决Tomcat服务器在控制台窗口中的乱码问题
    产生乱码的根本原因就是编码和解码不一致,比较常见的编码格式有Unicode、ASCll码、GBK、UTF-8等,Tomcat控制台的乱码问题只需要把日志配置文件中的UTF-8格式改成GBK格式就行解决方法:1、找到Tomcat的安装目录下conf文件夹2、打开conf文件夹中的logging.properties文件,并搜索找......
  • PTA||7-2 求最大值及其下标(第九周)
    本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始)。输入格式:输入在第一行中给出一个正整数n(1<n≤10)。第二行输入n个整数,用空格分开。输出格式:在一行中输出最大值及最大值的最小下标,中间用一个空格分开。输入样例:628101910输出样例:10......
  • 在Windows操作系统中,HKEY_CURRENT_USER\Console 是注册表中的一个键路径,它用于存储与
    在Windows操作系统中,HKEY_CURRENT_USER\Console是注册表中的一个键路径,它用于存储与控制台窗口(例如命令提示符窗口,CMD)的配置和设置相关的数据。以下是HKEY_CURRENT_USER\Console的详细说明:1. 位置路径:HKEY_CURRENT_USER\Console\2. 作用这个注册表项包含了当前用户对控制......
  • # python # 可视化窗口 # 可应用与爬虫 # tkinter
    具有功能:创建窗口,监听窗口(可自定义打印图片-选项-按键)所需工具:pycham所需库:tkinter代码讲解:1.导入库-创建窗口-设置窗口大小-设置标题importtkinterastk#创建一个窗口root=tk.Tk()#设置窗口大小root.geometry("800x400+400+200")#注意这里使用的是英文字......
  • clickhouse数据库,时间范围一周,周期为每一小时,聚合数据中的最新,最大值,最小值,平均值,求和
    工作中通过ai改来改去最后实现的,非常好用databaseVal举例:1HOURinterval:1WEEK最新,这里用到了ROW_NUMBER,就是编号,OVER就是分组,分组是通过一小时聚合,聚合后会有编号每一个组的,从1开始到该组结束,取每组的第一条就是最新的SELECTreport_timeAStimeInterval,cpu_usageAScpu......