【lc刷题 day12】堆/栈/队列

news2025/1/8 17:57:06

BM42 用两个栈实现队列 easy

import java.util.Stack;

public class Solution {
    Stack<Integer> stack1 = new Stack<Integer>();
    Stack<Integer> stack2 = new Stack<Integer>();
    
    public void push(int node) {
        stack1.push(node);
    }
    
    public int pop() {
        if(stack2.isEmpty()){
            while(!stack1.isEmpty()){
                stack2.push(stack1.pop());
            }
        }
        return stack2.pop();
    }
}

时间复杂度O(N),空间复杂度O(1)

BM43 包含min函数的栈 easy

import java.util.Stack;

public class Solution {
    Stack<Integer> min=new Stack<>();
    Stack<Integer> s=new Stack<>();
    
    public void push(int node) {
        s.push(node);
        if(min.isEmpty()){
            min.push(node);
        }else if(node<=min.peek()){
            min.push(node);
        }
    }
    
    public void pop() {
        int node=s.pop();
        if(node==min.peek()){
            min.pop();
        }
    }
    
    public int top() {
        return s.peek();
    }
    
    public int min() {
        return min.peek();
    }
}

BM44 有效括号序列 easy

import java.util.*;


public class Solution {
    /**
     * 
     * @param s string字符串 
     * @return bool布尔型
     */
    public boolean isValid (String s) {
        // write code here
        Stack<Character> stack=new Stack<>();
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            if(ch=='['||ch=='{'||ch=='('){
                stack.push(ch);
            }else if(!stack.isEmpty()){
                if(ch==')'&&stack.peek()=='('){
                    stack.pop();
                }else if(ch==']'&&stack.peek()=='['){
                    stack.pop();
                }else if(ch=='}'&&stack.peek()=='{'){
                    stack.pop();
                }else{
                    return false;
                }
            }else{
                return false;
            }
        }
        return stack.isEmpty();
    }
}

BM45 滑动窗口的最大值 hard

import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
        //这么写会报错,因为题目要求返回ArrayList<>
        //List<Integer> res=new ArrayList<>();
        ArrayList<Integer> res=new ArrayList<>();
        if(size<=num.length&&size!=0){
            //创建双向队列
            Deque<Integer> dq=new ArrayDeque<>();
            //先处理第一个滑动窗口的数据
            for(int i=0;i<size;i++){
                //如果num[i]大于dq中的数据,则删除
                if(!dq.isEmpty()&&num[dq.peekLast()]<num[i])
                    dq.pollLast();
                dq.add(i);
            }
            //比如num为{2,4,3,1,6},size为3
            //则第一个for循环后的结果为dq{4,3}
            
            for(int i=size;i<num.length;i++){
                //将dq.peekFirst()对应的数值写入res
                res.add(num[dq.peekFirst()]);
                //如果dq.peekFirst出了滑动窗口,则退出队列
                if(!dq.isEmpty()&&dq.peekFirst()<(i-size+1))
                    dq.pollFirst();
                //如果num[i]大于dq中的数据,则删除
                while(!dq.isEmpty()&&num[dq.peekLast()]<num[i])
                    dq.pollLast();
                dq.add(i);
            }
            res.add(num[dq.pollFirst()]);
        }
        return res;
    }
}

题目要求时间复杂度O(N),空间复杂度O(N)
使用双向队列

关于ArrayDeque的常用方法

Modifier and Type Method and Description
boolean add(E e)
在此deque的末尾插入指定的元素。
void addFirst(E e)
在此deque前面插入指定的元素。
void addLast(E e)
在此deque的末尾插入指定的元素。
void clear()
从这个deque中删除所有的元素。
ArrayDeque clone()
返回此deque的副本。
boolean contains(Object o)
如果此deque包含指定的元素,则返回 true 。
Iterator descendingIterator()
以相反的顺序返回此deque中的元素的迭代器。
E element()
检索,但不删除,由这个deque表示的队列的头。
E getFirst()
检索,但不删除,这个deque的第一个元素。
E getLast()
检索,但不删除,这个deque的最后一个元素。
boolean isEmpty()
如果此deque不包含元素,则返回 true 。
Iterator iterator()
返回此deque中的元素的迭代器。
boolean offer(E e)
在此deque的末尾插入指定的元素。
boolean offerFirst(E e)
在此deque前面插入指定的元素。
boolean offerLast(E e)
在此deque的末尾插入指定的元素。
E peek()
检索但不删除由此deque表示的队列的头部,如果此deque为空,则返回 null 。
E peekFirst()
检索但不删除此deque的第一个元素,如果此deque为空,则返回 null 。
E peekLast()
检索但不删除此deque的最后一个元素,或返回 null如果此deque为空)。
E poll()
检索并删除由此deque(换句话说,该deque的第一个元素)表示的队列的 null如果此deque为空,则返回 null 。
E pollFirst()
检索并删除此deque的第一个元素,如果此deque为空,则返回 null 。
E pollLast()
检索并删除此deque的最后一个元素,如果此deque为空,则返回 null 。
E pop()
从这个deque表示的堆栈中弹出一个元素。
void push(E e)
将元素推送到由此deque表示的堆栈上。
E remove()
检索并删除由此deque表示的队列的头部。
boolean remove(Object o)
从此deque中删除指定元素的单个实例。
E removeFirst()
检索并删除此deque的第一个元素。
boolean removeFirstOccurrence(Object o)
删除此deque中指定元素的第一个出现(从头到尾遍历deque时)。
E removeLast()
检索并删除此deque的最后一个元素。
boolean removeLastOccurrence(Object o)
删除此deque中指定元素的最后一次(从头到尾遍历deque时)。
int size()
返回此deque中的元素数。
Spliterator spliterator()
创建一个late-binding和失败快速 Spliterator在这个deque的元素。
Object[] toArray()
以适当的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素)。
T[] toArray(T[] a)
以正确的顺序返回一个包含此deque中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。

插入删除方法总结

在这里插入图片描述

BM46 最小的K个数 medium

import java.util.*;
public class Solution {
    public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        //排除特殊情况
        if(k == 0 || input.length == 0) 
            return res;
        //大根堆 
        PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));
        //构建一个k个大小的堆  
        for(int i = 0; i < k; i++)
            q.offer(input[i]);
        for(int i = k; i < input.length; i++){
            //较小元素入堆
            if(q.peek() > input[i]){  
                q.poll();
                q.offer(input[i]);
            }
        }
        //堆中元素取出入数组
        for(int i = 0; i < k; i++) 
            res.add(q.poll());
        return res;
    }
}


大根堆,小根堆
题目要求时间复杂度O(nlogk),空间复杂度O(n)

创建大根堆

//大根堆 
        PriorityQueue<Integer> q = new PriorityQueue<>((o1, o2)->o2.compareTo(o1));

这是用到了lambda表达式

// 1. 不需要参数,返回值为 2
() -> 2
// 2. 接收一个参数(数字类型),返回其2倍的值
x -> 2 * x
// 3. 接受2个参数(数字),并返回他们的和
(x, y) -> x + y
// 4. 接收2个int型整数,返回他们的乘积
(int x, int y) -> x * y
// 5. 接受一个 string 对象,并在控制台打印,不返回任何值(看起来像是返回void)
(String s) -> System.out.print(s)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

随便聊聊浪潮开务数据库

今天这个话题挺随意&#xff0c;我们来聊聊浪潮开务数据库&#xff0c;原因主要是我的微信朋友圈被这个数据库刷屏了。当然我对这款号称多模数据库的非开源数据库也很感兴趣&#xff0c;也有很多疑问&#xff0c;希望各位专家能帮忙答疑解惑&#xff0c;揭开这款即将发布的 Kai…

机器学习--多层感知机、卷积神经网络、循环神经网络

目录 一、多层感知机 二、卷积神经网络 三、循环神经网络 总结 一、多层感知机 手工提取特征&#xff08;用人的知识进行&#xff09; --> 神经网络来提取特征。 神经网络&#xff08;可能更懂机器学习&#xff09;来提取 可能对后面的线性或softmax回归可能会更好一…

【UE4 第一人称射击游戏】23-添加子弹伤害

上一篇&#xff1a;https://blog.csdn.net/ChaoChao66666/article/details/128589063?spm1001.2014.3001.5501本篇效果&#xff1a;步骤&#xff1a;创建一个蓝图类&#xff08;父类为Character&#xff09;&#xff0c;命名为“SimpleAI”双击打开“SimpleAI”&#xff0c;点…

非对称加密实战(一):JDK生成keystore获取公钥私钥及代码验证【附源码】

目录使用说明非对称加密生成keystore文件公钥私钥互相解密获取fd-alias.keystore中的公钥私钥使用生成公钥私钥进行解密源码地址使用说明 非对称加密 非对称加密算法主要有&#xff1a;RSA、Elgamal、背包算法、Rabin、D-H、ECC&#xff08;椭圆曲线加密算法&#xff09;。下…

TensorRT学习笔记--基于FCN-ResNet101推理引擎实现语义分割

目录 前言 1--Pytorch模型转换为Onnx模型 2--Onnx模型可视化及测试 2-1--可视化Onnx模型 2-2--测试Onnx模型 3--Onnx模型转换为Tensor RT推理模型 4--基于Tensor RT使用推理引擎实现语义分割 前言 基于Tensor RT的模型转换流程&#xff1a;Pytorch → Onnx → Tensor RT…

通用vue组件化首页

一、首先先建立文件main.vue,构建主体 1.选择合适的模板element-plus,直接复制 2.编写相应的样式 <template><div class"main"><el-container class"main-content"><el-aside> aside </el-aside><el-container class&q…

2022年中职组网络安全竞赛D模块竞赛漏洞报告单总结

Windows加固 后门用户 漏洞发现过程 打开cmd使用net user 看到”hacker”用户,疑似存在后门用户 使用hacker/123456成功登录目标服务器,证明存在后门用户 漏洞加固过程 删除后门用户

HTML与CSS基础(一)—— HTML基础(web标准、开发工具、标签)

目标能够理解HTML的 基本语法 和标签的关系 能够使用 排版标签 实现网页中标题、段落等效果 能够使用 相对路径 选择不同目录下的文件 能够使用 媒体标签 在网页中显示图片、播放音频和视频 能够使用 链接标签 实现页面跳转功能一、基础认知目标&#xff1a;认识 网页组成 和 五…

【Linux】程序的翻译四个阶段(图示详解)

因为淋过雨&#xff0c;所以懂的为别人撑伞&#xff1b;因为迷茫过&#xff0c;所以懂得为别人指路。 我们都知道写好代码后&#xff0c;编译器会帮助我们把代码生成可执行程序&#xff0c;细加了解又会知道程序的生成又分为四步&#xff1a;预处理、编译、汇编、链接。那么这四…

JAVA语言基础语法——异常中的常见方法及抛出异常等练习

Throwable的成员方法定义在最顶级Throwable类中a.实例如下&#xff1a;e.printStackTrace(); 将异常的所有信息红色的字体打印在控制台&#xff0c;不会结束虚拟机&#xff0c;仅仅只是打印的操作。抛出处理throws注意&#xff1a;写在方法定义处&#xff0c;表示声明一个异常&…

DOM(三):鼠标、键盘事件对象

鼠标、键盘事件对象鼠标事件对象键盘事件对象鼠标事件对象 event对象代表事件的状态&#xff0c;和事件相关的一系列信息的集合。现阶段我们主要是用鼠标事件对象MouseEvent和键盘事件对象KeyboardEvent 例如&#xff1a; // 鼠标事件对象 MouseEventdocument.addEventListene…

Android正确的保活方案,不要掉进保活需求死循环陷进

在开始前&#xff0c;还是给大家简单介绍一下&#xff0c;以前出现过的一些黑科技&#xff1a; 大概在6年前Github中出现过一个叫MarsDaemon&#xff0c;这个库通过双进程守护的方式实现保活&#xff0c;一时间风头无两。好景不长&#xff0c;进入 Android 8.0时代之后&#x…

STM32系列单片机标准库移植FreeRTOS V10.4.6详解

文中所用到的资料下载地址 https://download.csdn.net/download/qq_20222919/87370679 最近看正点原子新录制了手把手教你学FreeRTOS的视频教程&#xff0c;看了一下教程发现视频里面讲的是使用HAL移植 FreeRTOS V10.4.6 版本&#xff0c;以前的标准库移植的是FreeRTOS V9.0 版…

关于PostgreSQL JIT Memory-Leak 问题 从 LLVM源码层面来分析

文章目录前言LLVM Types 在 JIT中的使用LLVM Types 设计导致的 PG JIT 内存问题分析解决&#xff1f;前言 之前介绍 PG 的 JIT 实现 时提到 为了性能开启JIT 之后有一个比较严重的内存泄漏问题。现象就是在一个backend 内持续跑大量的 sqllogic 随机复杂查询&#xff0c;能够看…

java 微服务 Nacos配置 feign 网关路由

Nacos配置管理 配置信息我们写有热更新需求的配置就可以了 1.引入Nacos的配置管理客户端依赖&#xff1a; <!--nacos配置管理依赖--> <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config…

HBase基础_1

HBase 注&#xff1a;大家觉得博客好的话&#xff0c;别忘了点赞收藏呀&#xff0c;本人每周都会更新关于人工智能和大数据相关的内容&#xff0c;内容多为原创&#xff0c;Python Java Scala SQL 代码&#xff0c;CV NLP 推荐系统等&#xff0c;Spark Flink Kafka Hbase Hive…

学习笔记6:字符串库函数(下)

目录 一. strstr模拟实现 二. strtok模拟实现 三.关于strerror和perror的说明 一. strstr模拟实现 库函数strstr函数首部&#xff1a;char * strstr ( const char *str1, const char * str2); 函数的功能是在str1指向的主字符串中寻找子串str2&#xff0c;并且返回主字符串中…

JS数组对象——英文按照首字母进行排序sort()、localeCompare()

JS数组对象——英文按照首字母进行排序(sort、localeCompare&#xff09;上期回顾场景复现sort()方法与localeCompare实例应用上期回顾 文章内容文章链接JS数组对象——根据日期进行排序Date.parse()&#xff0c;按照时间进行升序或降序排序https://blog.csdn.net/XSL_HR/arti…

【CANN训练营第三季】AI目标属性编辑应用

文章目录1、参考样例进行运行stargan2、dvpp媒体数据处理结业考核题目1、题目2、题目31、参考样例进行运行stargan 下载stargan后&#xff0c;查看readme&#xff0c;进行复现。 # 为了方便下载&#xff0c;在这里直接给出原始模型下载及模型转换命令,可以直接拷贝执行。 cd …

Tic-Tac-Toe:基于Minimax算法的人机对弈程序(python实现)

目录 1. 前言 2. Minimax算法介绍 2.1 博弈树 2.2 估值函数 2.3 基本算法思想 2.4 实例1 ​​​​​​​2.5 实例2—棋类游戏 2.6 小结 3. Tic-Tac-Toe minimax AI实现 3.1 函数说明 3.2 处理流程 3.3 代码 4. 小结 1. 前言 在上一篇中实现一个简单的Tic-Tac-Toe人…