秋招力扣Hot100刷题总结——栈和队列

embedded/2024/9/24 3:27:43/

1. 有效的括号 leetcode.cn/problems/valid-parentheses/description/" rel="nofollow">题目链接

  • 题目要求:给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
    有效字符串需满足:
    左括号必须用相同类型的右括号闭合。
    左括号必须以正确的顺序闭合。
    每个右括号都有一个对应的相同类型的左括号。
    在这里插入图片描述
  • 代码及思路
    • 经典的使用栈来解决的问题
    • 遇到左括号将对应的右括号入栈,遇到右括号则与栈顶元素进行比较,若不同则直接返回false,相同则弹出栈顶元素
    • 最后栈为空,表明完全匹配,返回true
    • 代码
class Solution {public boolean isValid(String s) {if(s.length()%2!=0)return false;Deque<Character> cache=new LinkedList<>();for(int i=0;i<s.length();i++){char c=s.charAt(i);if(c=='('){cache.push(')');}else if(c=='['){cache.push(']');}else if (c=='{'){cache.push('}');}else if(c==')'){if(cache.isEmpty()||c!=cache.pop())return false;}else if(c==']'){if(cache.isEmpty()||c!=cache.pop())return false;}else if(c=='}'){if(cache.isEmpty()||c!=cache.pop())return false;}}return cache.isEmpty();}
}

2. 滑动窗口最大值 leetcode.cn/problems/sliding-window-maximum/" rel="nofollow">题目链接

  • 题目要求:给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
    返回 滑动窗口中的最大值 。
    在这里插入图片描述
  • 使用一个单调递增的双向队列解决问题
  • 遍历数组元素,在每一次遍历中当窗口大小大于k时,将队列最初元素出栈
  • 循环将小于当前元素的队尾元素出栈
  • 当达到窗口大小后开始记录窗口最大值,即为队列队首元素
  • 注意队列中存储的是元素的下标值
  • 代码
class Solution {public int[] maxSlidingWindow(int[] nums, int k) {Deque<Integer> cache=new LinkedList<>();int[] res=new int[nums.length-k+1];int j=0;for(int i=0;i<nums.length;i++){while(!cache.isEmpty()&&i-k+1>cache.getFirst()){cache.pollFirst();}while(!cache.isEmpty()&&nums[i]>nums[cache.getLast()]){cache.pollLast();}cache.offer(i);if(i-k+1>=0)res[j++]=nums[cache.getFirst()];}return res;}
}

3. 字符串解码 leetcode.cn/problems/decode-string/description/" rel="nofollow">题目链接

  • 题目要求:给定一个经过编码的字符串,返回它解码后的字符串。
    编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
    你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
    此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
    在这里插入图片描述
  • 代码及思路
    • 使用栈解决问题,分别使用一个栈存储数字和之前的字符串
    • 遇到‘[’将数字和当前字符串入栈,遇到’]'则将之前的数字和字符串取出和当前的字符串做拼接
    • 代码
class Solution {public String decodeString(String s) {Stack<Integer> numbers=new Stack<>();Stack<String> strs=new Stack<>();int num=0;String cur="";for(int i=0;i<s.length();i++){char c=s.charAt(i);if(c>='0'&&c<='9'){num=num*10+c-'0';}else if(c=='['){numbers.push(num);num=0;strs.push(cur);cur="";}else if(c==']'){StringBuilder temp=new StringBuilder(strs.pop());int len=numbers.pop();for(int j=0;j<len;j++){temp.append(cur);}cur=temp.toString();}else{cur=cur+c;}} return cur;}
}

4. 回文链表 leetcode.cn/problems/palindrome-linked-list/description/" rel="nofollow">题目链接

  • 题目要求:给你一个单链表的头节点 head ,请你判断该链表是否为
    回文链表。如果是,返回 true ;否则,返回 false 。
    在这里插入图片描述
  • 代码及思路
    • 使用栈解决,先遍历链表将所有节点的值压入栈中
    • 再次从头遍历链表,每次将节点值与栈顶元素相比较
    • 代码
/*** Definition for singly-linked list.* public class ListNode {*     int val;*     ListNode next;*     ListNode() {}*     ListNode(int val) { this.val = val; }*     ListNode(int val, ListNode next) { this.val = val; this.next = next; }* }*/
class Solution {public boolean isPalindrome(ListNode head) {if(head==null)return true;if(head.next==null)return true;ListNode cur=head;Stack<Integer> cache=new Stack<>();while(cur!=null){cache.push(cur.val);cur=cur.next;}cur=head;while(cur!=null){int num=cache.pop();if(cur.val!=num)return false;cur=cur.next;}return true;}
}

5. 每日温度 leetcode.cn/problems/daily-temperatures/description/" rel="nofollow">题目链接

  • 题目要求:给定一个整数数组 temperatures ,表示每天的温度,返回一个数组 answer ,其中 answer[i] 是指对于第 i 天,下一个更高温度出现在几天后。如果气温在这之后都不会升高,请在该位置用 0 来代替。
    在这里插入图片描述
  • 代码及思路
    • 使用一个单调递减栈来存储温度的下标值
    • 遍历温度数组,然后循环找出栈中小于当前温度的温度下标值,更新answer数组
    • 将当前温度的下标入栈
    • 代码
class Solution {public int[] dailyTemperatures(int[] temperatures) {int[] answers=new int[temperatures.length];Stack<Integer> cache=new Stack<>();for(int i=0;i<temperatures.length;i++){while(!cache.isEmpty()&&temperatures[i]>temperatures[cache.peek()]){int j=cache.pop();answers[j]=i-j;}cache.push(i);}return answers;}
}

http://www.ppmy.cn/embedded/100788.html

相关文章

计算机网络计算题【408】——里昂视频

计算机网络【408】计算题 计算机网络概述【17题】【18题】甘特图【19题】甘特图【20题】【21题】 通信基础【14】求最大传输速率使用两个公式【27】【28】【29】差分曼彻斯特【30】[21]重点 p14 通信基础T31 流量控制与可靠传输机制T21 选择重传协议[GBN]:SR [22][24]***⭐【25…

什么是营销自动化?营销自动化的优势?

在SaaS行业和软件行业中&#xff0c;营销自动化作为一种先进的营销手段&#xff0c;正逐渐受到企业的青睐。营销自动化基于大数据和人工智能技术&#xff0c;能够自动执行、管理和完成营销任务和流程&#xff0c;为企业带来诸多优势。 营销自动化是一种能够一体化执行、管理、…

JVM 运行时内存结构简介

JVM 运行时内存结构简介 一、前言二、JVM 运行时内存结构2.1 线程隔离数据区&#xff1a;2.2 线程共享数据区&#xff1a; 三、JVM 内存区域划分1. 程序计数器&#xff08;PC&#xff09;2. 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池 附录 一、前言 JVM&#…

仿Muduo库实现高并发服务器——EventLoop模块

我刚开始看这个模块时&#xff0c;也是看不明白&#xff0c;什么是事件管理模块。 此时此刻&#xff0c;大领导的背影&#xff0c;还是那么清晰。结合故事模块&#xff0c;慢慢理。 EventLoop模块 成员&#xff1a; 绿色&#xff1a; 利用智能指针对new出来的对象进行管理&…

yd云手机登录算法分析

yd云手机登录算法分析 yd云手机登录算法分析第一步&#xff1a;抓包-登录第二步&#xff1a;定位加密入口第三步&#xff1a;分析加密算法第四步&#xff1a;算法实现 yd云手机登录算法分析 在这篇文章中&#xff0c;我们将详细解析yd云手机的登录算法&#xff0c;涵盖从抓包到…

Python元组之不可变序列的奥秘与应用方式例子解析

代码示例&#xff1a; Python中的元组&#xff08;Tuple&#xff09;是一种有序的、不可变的数据结构&#xff0c;它与列表类似&#xff0c;但具有一些独特的特性和应用方式。以下是关于Python元组的一些关键点和详细例子&#xff1a; 创建元组&#xff1a;元组可以通过圆括号…

API接口安全101:基础概念与最佳实践

文章目录 API定义协议架构风格描述语言 Webservicewsdl介绍复现 SOAPswagger介绍指纹查找利用存在目录复现 HTTPWebpack介绍复现 在当今数字化时代,API接口已成为现代软件架构中不可或缺的组成部分。它们连接着各种应用程序和服务,促进了数据交换和功能集成。然而,随着API的普及…

Java | Leetcode Java题解之第355题设计推特

题目&#xff1a; 题解&#xff1a; class Twitter {private class Node {// 哈希表存储关注人的 IdSet<Integer> followee;// 用链表存储 tweetIdLinkedList<Integer> tweet;Node() {followee new HashSet<Integer>();tweet new LinkedList<Integer&g…