首页 > 编程语言 >【leetcode 239. 滑动窗口最大值】Java优先队列——PriorityQueue类

【leetcode 239. 滑动窗口最大值】Java优先队列——PriorityQueue类

时间:2023-12-12 21:11:52浏览次数:38  
标签:pq Java val nums int id PriorityQueue new leetcode

leetcode 239. 滑动窗口最大值

题目描述:
1e5大小的nums[]数组中长度为k(1<=k<=1e5)的窗口的最大值

题解:
暴力求解O(n^2)会超时,需要O(nlogn)的解法

使用大根堆优先队列维护窗口元素,每次取最大值复杂度降为O(1),堆结构维护复杂度O(logn)

问:如果维护窗口[l, r]前[0, l - 1]的元素不影响题目结果?
答:维护队头元素的下标在窗口[l, r]内即可。换句话说,在每次取队头元素之前,先判断队头元素是否在当前合法的窗口内,如果不合法就使其出队,如果合法那么队头元素就是当前窗口的最大值,因为窗口的移动间距为1,因此每次最多出队一个元素,因此查询最大值的复杂度最高为O(logn)

使用自定义内部类Pair维护(id, nums[id])
class Solution {

    class Pair{
        int id = 0;
        int val = 0;
        Pair(int id, int val) {
            this.id = id;
            this.val = val;
        }
    }

    public int[] maxSlidingWindow(int[] nums, int k) {
        Queue<Pair> pq = new PriorityQueue<>((o1, o2) -> {
            if(o1.val != o2.val) return o2.val - o1.val;
            return o1.id - o2.id;
        });

        int len = nums.length;
        int[] ans = new int[len - k + 1];
        for(int i = 0; i < k; ++ i ){
            pq.offer(new Pair(i, nums[i]));
        }
        ans[0] = pq.peek().val;
        int st = 0;
        for(int i = k; i < len; ++ i ) {
            pq.offer(new Pair(i, nums[i]));
            while(pq.peek().id < i - k + 1) pq.poll();
            ans[++ st] = pq.peek().val;
        }
        return ans;
    }
}
使用int[]维护(id, nums[id])
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        Queue<int[]> pq = new PriorityQueue<>((o1, o2) -> {
            if(o1[1] != o2[1]) return o2[1] - o1[1];
            return o1[0] - o2[0];
        });
        int len = nums.length;
        int[] ans = new int[len - k + 1];
        for(int i = 0; i < k; ++ i ) {
            pq.offer(new int[]{i, nums[i]});
        }
        ans[0] = pq.peek()[1];
        int st = 0;
        for(int i = k; i < len; ++ i ) {
            pq.offer(new int[]{i, nums[i]});
            while(pq.peek()[0] < i - k + 1) pq.poll();
            ans[++ st] = pq.peek()[1];
        }
        return ans;
    }
}

标签:pq,Java,val,nums,int,id,PriorityQueue,new,leetcode
From: https://www.cnblogs.com/Eve7Xu/p/17897798.html

相关文章

  • Java 8 Stream 流的常用方法总结
    Java8Stream流的常用方法总结Java8引入了一个新的API:StreamAPI,它允许我们以声明式的方式处理数据集合。StreamAPI提供了一系列强大的方法,可以帮助我们更简洁、高效地处理数据。本文将总结Java8Stream流的常用方法,并提供相应的代码示例。1.创建Stream首先,我们需要了......
  • JavaScript 中栈与堆的区别
    每种编程语言都具有内建的数据类型,但它们的数据类型常有不同之处,使用方式也很不一样,比如C语言在定义变量之前,就需要确定变量的类型。在声明变量之前需要先定义变量类型。我们把这种在使用之前就需要确认其变量数据类型的称为静态语言。相反地,我们把在运行过程中需要检查数据类型......
  • 无涯教程-Java Access Modifiers函数
    Java提供了许多访问修饰符来设置类,变量,方法和构造函数的访问级别。四个访问级别是-default(默认):对当前包可见,不需要修饰符。private(私有):当前类可见。public(公共):都可见。protected(受保护):对当前包和所有子类可见。默认访问修饰符默认访问修饰符意味着我们......
  • 无涯教程-Java - Singleton Classes函数
    Singleton的目的是控制对象的创建,将对象的数量限制为一个。由于只有一个Singleton实例,因此Singleton的任何实例字段在每个类中只会出现一次,就像static字段一样。单例通常控制对资源的访问,例如数据库连接或Socket。例如,如果您仅对数据库的一个连接拥有许可证,或者JDBC驱动......
  • java文件的上传与下载
    1、文件上传下载1.1文件上传什么是文件上传?要将客户端(浏览器)大数据存储到服务器端,不将数据直接存储到数据库中,而是要将数据存储到服务器所在的磁盘上,这就要使用文件上传。为什么使用文件上传?通过文件上传,可以将浏览器端的大数据直接保存到服务器端。不将数据保存到数据库中......
  • Java Spring Boot 拦截器的使用小结
    很多时候,我们在开发项目中,总是希望在接口中,尽量进行业务处理,其余的事项交给其他组件来处理,比如:登录验证日志记录接口性能在SpringBoot中,正如大多数框架一样,可以用到拦截件进行处理,不管叫中间件还是拦截件,总之都是为了让我们更好的专注于业务,解耦功能。我们看看SpringB......
  • 《Effective Java》阅读笔记-第五章
    EffectiveJava阅读笔记第五章泛型第26条不要使用原生类型随着泛型的普及,这条没什么可说的。如果不知道具体类型,可以使用<?>来代替。第27条消除unchecked警告原生类型到泛型转换时,编译会有警告,可以使用@SuppressWarnings("unchecked")来消除警告。并且应该在尽可......
  • 秦疆的Java课程笔记:65 面向对象 创建对象内存分析
    先写两个类//创建一个Pet类==============================packageOOP.demo;publicclassPet{publicStringname;publicintage;publicvoidshout(){System.out.println("喵~~");}}//主程序Application================......
  • java计算二个经纬度间的距离(百度坐标)
    1:背景工作中遇到计算二个地点之间的距离,根据百度经纬度进行计算。2:maven依赖<dependency><groupId>org.gavaghan</groupId><artifactId>geodesy</artifactId><version>1.1.3</version></dependency>3:代码实现packagecom.pacific.transfe......
  • 零基础30天学会Java-韩顺平
    第一章概述了解了该视频课程的大纲和Java的基本知识,Java1995年推出,目前稳定维护的有Java8和Java11版本。JVM(Java虚拟机):JVM包含于JDK中,Java虚拟机机制屏蔽了底层运行平台的差别,实现了“一次编译,到处运行"JRE(Java运行环境):JRE=JVM+Java的核心类库。JDK(Java开发工具包):JDK=JRE+Jav......