day12--150. 逆波兰表达式求值+239. 滑动窗口最大值+ 347. 前 K 个高频元素

一、150. 逆波兰表达式求值

题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/
文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html
视频讲解:https://www.bilibili.com/video/BV1kd4y1o7on

1.1 初见思路

  1. 就是用栈,碰到符号,就弹出最上面的2个元素,计算完后吧结果再push进栈

1.2 具体实现

class Solution {
    public int evalRPN(String[] tokens) {
       Deque<Integer> deque = new LinkedList();
        for (int i = 0; i < tokens.length; i++) {
            String token = tokens[i];
            if(token.equals("+")){
                int num2 = deque.pop();
                int num1 = deque.pop();
                deque.push(num1+num2);
            }
            else if(token.equals("-")){
                int num2 = deque.pop();
                int num1 = deque.pop();
                deque.push(num1-num2);
            }
            else if(token.equals("*")){
                int num2 = deque.pop();
                int num1 = deque.pop();
                deque.push(num1*num2);
            }
            else if(token.equals("/")){
                int num2 = deque.pop();
                int num1 = deque.pop();
                deque.push((num1/num2));
            }
            else{
                deque.push(Integer.parseInt(token));
            }
        }
        return deque.pop();
    }
}

1.3 重难点

二、 239. 滑动窗口最大值

题目链接:https://leetcode.cn/problems/sliding-window-maximum/
文章讲解:https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%E7%AA%97%E5%8F%A3%E6%9C%80%E5%A4%A7%E5%80%BC.html
视频讲解:https://www.bilibili.com/video/BV1XS4y1p7qj

2.1 初见思路

  1. 使用双端队列,得知道移动时,应该去除哪个值,增加哪个值
  2. 记录当前窗口内最大值,若移除了最大值,则重新比一遍窗口内的最大值
  3. 若未移除最大值,比较新增值和最大值,更新最大值

2.2 具体实现

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length-k+1];
        int maxNum=Integer.MIN_VALUE;
        LinkedList<Integer> linkedList = new LinkedList<>();
        for(int i=0;i<k;i++){
            linkedList.addLast(nums[i]);
            maxNum=Math.max(nums[i],maxNum);
        }
        res[0]=maxNum;
        for(int i=k;i<nums.length;i++){
           
            
            int outNum = linkedList.peekFirst();
            //若未移除最大值,比较新增值和最大值
            if(outNum!=maxNum){
                maxNum=maxNum<nums[i]?nums[i]:maxNum;
                linkedList.pollFirst();
                linkedList.addLast(nums[i]);
            }
            else{
                linkedList.pollFirst();
                linkedList.addLast(nums[i]);
                //重新比一遍窗口内的最大值
                maxNum = getMax(linkedList);
            }
            
             res[i-k+1]=maxNum;
        }
        return res;
    }

    public int getMax(LinkedList<Integer> list){
        int max=Integer.MIN_VALUE;
        for (Integer integer : list) {
            max=Math.max(max,integer);
        }
        return max;
    }
}
上面的实现方式会在k很大的时候超时,因为getMax()方法会遍历,所以会超时;
得使用双端队列构建出有序队列
class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        ArrayDeque<Integer> deque = new ArrayDeque<>();
        int n = nums.length;
        int[] res = new int[n - k + 1];
        int idx = 0;
        for(int i = 0; i < n; i++) {
            // 根据题意,i为nums下标,是要在[i - k + 1, i] 中选到最大值,只需要保证两点
            // 1.队列头结点需要在[i - k + 1, i]范围内,不符合则要弹出
            while(!deque.isEmpty() && deque.peek() < i - k + 1){
                deque.poll();
            }
            // 2.既然是单调,就要保证每次放进去的数字要比末尾的都大,否则也弹出
            while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]) {
                deque.pollLast();
            }

            deque.offer(i);

            // 因为单调,当i增长到符合第一个k范围的时候,每滑动一步都将队列头节点放入结果就行了
            if(i >= k - 1){
                res[idx++] = nums[deque.peek()];
            }
        }
        return res;
    }
}

2.3 重难点

  • 要会使用双端队列构建出有序队列

三、 347. 前 K 个高频元素

题目链接:https://leetcode.cn/problems/top-k-frequent-elements/description/
文章讲解:https://programmercarl.com/0347.%E5%89%8DK%E4%B8%AA%E9%AB%98%E9%A2%91%E5%85%83%E7%B4%A0.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
视频讲解:https://www.bilibili.com/video/BV1Xg41167Lz

3.1 初见思路

3.2 具体实现

class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int num:nums){
            map.put(num,map.getOrDefault(num,0)+1);
        }

        PriorityQueue<Integer> queue = new PriorityQueue<>((p1,p2)->{
            return map.get(p1)-map.get(p2);
        });
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            //queue不满的时候直接插入
            if(queue.size()<k){
                queue.add(entry.getKey());
            }
            //queue满了就需要移除后再插入
            else if(entry.getValue()>map.get(queue.peek())){
                queue.remove();
                queue.add(entry.getKey());
            }
        }
        int[] res = new int[queue.size()];
        int index=0;
        for(int i=k-1;i>=0;i--){//依次弹出小顶堆,先弹出的是堆的根,出现次数少,后面弹出的出现次数多
            res[i] = queue.poll();
        }
        return res;
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/717795.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

初级篇-Docker容器知识

Docker容器 容器主要是解决跨平台、跨服务运行环境的问题 容器将运行业务应用所需要的东西进行打包&#xff0c;包括依赖项、配置、脚本、二进制文件等。在容器中运行镜像&#xff0c;不用担心不同环境下运行不一致的问题。 容器本质上是一个特殊的进程&#xff0c;将资源、…

【Nvidia+AI车载摄像头】超小尺寸300万像素车载环视摄像头方案

作为一家致力于成像和视觉技术的科技创新公司&#xff0c;于近日推出了基于安森美300万像素AR0341AT图像传感器的超小尺寸车载环视摄像头模组&#xff0c;可助力提高驾驶的安全指标&#xff0c;有效解决高速自动驾驶对卓越的HDR性能和图像质量的需求&#xff0c;并降低系统开发…

Navicat 安装及初步配置指南

Navicat 是一款广泛使用的数据库管理工具&#xff0c;支持多种数据库&#xff0c;如 MySQL、PostgreSQL、SQLite 等。以下是 Navicat 安装步骤的详细说明&#xff1a; 在 Windows 上安装 Navicat 下载 Navicat 安装包&#xff1a; 访问 Navicat 官方网站&#xff1a;Navicat 官…

Linux 精通 4.2

reactor应用 response&#xff1a;回应的数据组织成包&#xff1b;request解析对方发来的data touch webserver.c int http_request(struct conn *c){// 传connect信息printf("request: %s\n", c->rbuffer) }int http_response(struct conn *c){}改reactor.c 的…

VM4.3 二次开发02 方案加载、执行及显示

效果 这是二次开发的第二个文章&#xff0c;所以不重复说明环境配置相关的内容。如果不懂的可以看本专栏的上一个文章。 海康视觉算法平台VisionMaster 4.3.0 C# 二次开发01 加载方案并获取结果-CSDN博客 界面代码 <Window x:Class"VmTestWpf.App.MainWindow"x…

线程池吞掉异常的case:源码阅读与解决方法

1. 问题背景 有一天给同事CR&#xff0c;看到一段这样的代码 try {for (param : params) {//并发处理&#xff0c;func无返回值ThreadPool.submit(func(param));} } catch (Exception e) {log.info("func抛异常啦,参数是:{}", param) } 我&#xff1a;你这段代码是…

【idea】gradle多模块构建项目内存溢出终止问题解决

背景 idea构建多模块项目&#xff0c;构建报错 Daemon is stopping immediately JVM garbage collector thrashing and after running out of JVM memory 解决 进到下图目录下 在文件管理中进入上面目录添加gradle.properties文件&#xff0c;内容如下 org.gradle.jvmargs-…

vue项目——前端CryptoJS加密、解密

1、vue项目需要安装CryptoJS安装包 npm install crypto-js 2、在项目中引入CryptoJS import CryptoJS from crypto-js 3、使用&#xff0c;代码如下 // 此处key为16进制let key jiajiajiajiajiajiajiajia;console.log(密钥&#xff1a;, key);// key格式化处理key Crypt…

检索增强生成(RAG)的挑战与优化措施

如何理解检索增强生成&#xff08;RAG&#xff09; 简单来说&#xff0c;RAG就是让LLM通过外部知识源获取额外信息&#xff0c;从而生成更准确、更符合上下文的答案&#xff0c;并减少错误信息&#xff08;或称为“幻觉”&#xff09;的产生。 我们都知道&#xff0c;最先进的…

深度学习 --- stanford cs231学习笔记四(神经网络的几大重要组成部分)

训练神经网络1 1&#xff0c;激活函数&#xff08;activation functions&#xff09; 激活函数是神经网络之于线性分类器的最大进步&#xff0c;最大贡献&#xff0c;即&#xff0c;引入了非线性。 1&#xff0c;1 Sigmoid sigmoid函数的性质&#xff1a; 结合指数函数的图像可…

pycharm git配置

PyCharm 是一个强大的集成开发环境(IDE),它内置了 Git 集成,使得版本控制变得非常方便。以下是 PyCharm 中配置 Git 的基本步骤: 安装Git: 在开始之前,请确保已经在您的系统上安装了 Git。您可以通过官方网站下载并安装 Git。本系统用的是Git-2.29.2.2-64-bit 。 打开PyC…

离散数学复习

1.关系的介绍和性质 &#xff08;1&#xff09;序偶和笛卡尔积 两个元素按照一定的顺序组成的二元组就是序偶&#xff0c;使用尖括号进行表示&#xff0c;尖括号里面的元素一般都是有顺序的&#xff1b; 笛卡尔积就是有两个集合&#xff0c;从第一个集合里面选择一个元素&am…

Python对象复制竟然有这么多种方式,赶紧学起来!

目录 1、浅拷贝:copy模块的copy()函数 📋 1.1 浅拷贝原理揭秘 1.2 实战演示:列表与字典的浅拷贝 列表浅拷贝示例 字典浅拷贝示例 1.3 注意事项:共享引用与独立对象 2、深拷贝:copy模块的deepcopy()函数 📌 2.1 深拷贝实现机制解析 2.2 深拷贝优势分析 2.3 深度…

DoIP——step2:车辆发现

文章目录 前言一、IP地址配置1.1 AutoIP1.2 DHCP1.3 DoIP实体的IP地址配置流程二、车辆发现车辆声明报文内容如下:前言 完成诊断设备到车辆的物理连接并通过激活线使能诊断连接后边缘节点将会将连接状态传递至应用层,在开始车辆发现过程之前,需要先进行各自的IP地址配置,获…

“Redis中的持久化:深入理解RDB与AOF机制“

目录 # 概念 1. RDB持久化 1.1 备份是如何执行的&#xff08;RDB过程&#xff09; 1.2 配置文件信息 1.3 RDB持久化操作 1.4 RDB优势 1.5 RDB劣势 1.6 RDB做备份 2. AOF持久化 2.1 AOF开启及使用 2.2 异常恢复 2.3 配置文件操作 2.4 AOF持久化流程 2.5 优点 2.6…

基于Unet++在kaggle—2018dsb数据集上实现图像分割

目录 1. 作者介绍2. 理论知识介绍2.1 Unet模型介绍 3. 实验过程3.1 数据集介绍3.2 代码实现3.3 结果 4. 参考链接 1. 作者介绍 郭冠群&#xff0c;男&#xff0c;西安工程大学电子信息学院&#xff0c;2023级研究生 研究方向&#xff1a;机器视觉与人工智能 电子邮件&#xff…

代发考生战报:HCIP H12-725安全变题了

代发考生战报&#xff1a;HCIP H12-725安全变题了&#xff0c;幸好当天找客服办理的包过服务&#xff0c;听同考场的考生说&#xff0c;考试全是新题&#xff0c;只有1-2个是题库上的题&#xff0c;自己考的都考挂了&#xff0c;帮我答题的老师很厉害&#xff0c;很赞&#xff…

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度

探索国内首家文生软件平台:码上飞CodeFlying

前言&#xff1a; AIGC (AI Generated Content) 作为人工智能领域最火热的分支之一&#xff0c;以ChatGPT等大模型为代表&#xff0c;迅速掀起了全球热潮。 国内的大厂如阿里、字节跳动、百度、腾讯等也纷纷推出了自己的大模型产品&#xff0c;涵盖了文生文、文生图、文生视频…

计算机网络(6) UDP协议

一.UDP数据报格式 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种简单的传输层协议&#xff0c;与TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;相比&#xff0c;UDP提供一种无连接、不可靠的数据传…