当前位置: 首页 > news >正文

LeetCode 150, 112, 130

文章目录

  • 150. 逆波兰表达式求值
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 112. 路径总和
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 130. 被围绕的区域
    • 题目链接
    • 标签
    • 思路
    • 代码

150. 逆波兰表达式求值

题目链接

150. 逆波兰表达式求值

标签

栈 数组 数学

思路

本题很像 JVM 中的 操作数栈,当写出以下三行代码时:

int i = 3;
int j = 4;
int k = i + j;

会产生如下的字节码指令(其中,每行的数字代表指令的地址):

0 iconst_3
1 istore_1
2 iconst_4
3 istore_2
4 iload_1 // 将 3 放入操作数栈
5 iload_2 // 将 4 放入操作数栈
6 iadd // 对 3、4 求和,并将结果放入操作数栈
7 istore_3
8 return

重点看 4, 5, 6 这几条指令,这就是本题的解法:使用一个栈来存储操作数,遍历 tokens 中的每一个 token,针对单个 token,有以下操作:

  • 对于数字,将其转化为 Integer 类型,存入栈中。
  • 对于 '+', '-', '*', '/' 这四种运算符,弹出栈中的两个 Integer 值作为操作数,进行对应运算。注意:由于栈是 先进后出 的,所以弹出栈的第一个 Integer 值是第一个操作数,第二个 Integer 值第二个操作数。

像这样遍历完所有 token 后,对最后一个运算符的操作会将最后一次运算的结果存储到栈中,也就是说,栈在最后会存在一个元素,这个元素就是运算结果。

代码

class Solution {public int evalRPN(String[] tokens) {LinkedList<Integer> stack = new LinkedList<>(); // 存储 操作数 的栈for (String token : tokens) { // 取出每个 token 进行操作int operand1, operand2; // 第一个操作数、第二个操作数switch (token) { // 对不同的 token,有不同的操作case "+":operand2 = stack.pop(); // 取出第二个操作数operand1 = stack.pop(); // 取出第一个操作数stack.push(operand1 + operand2); // 将 两数之和 放到栈中break;case "-":operand2 = stack.pop();operand1 = stack.pop();stack.push(operand1 - operand2); // 将 两数之差 放到栈中break;case "*":operand2 = stack.pop();operand1 = stack.pop();stack.push(operand1 * operand2); // 将 两数之积 放到栈中break;case "/":operand2 = stack.pop();operand1 = stack.pop();stack.push(operand1 / operand2); // 将 两数之商 放到栈中break;default:stack.push(Integer.valueOf(token)); // 将 这个数以 Integer 的类型 放到栈中}}return stack.pop(); // 返回栈中的最后一个数作为结果}
}

112. 路径总和

题目链接

112. 路径总和

标签

树 深度优先搜索 广度优先搜索 二叉树

思路

本题是 从根节点开始向叶子节点找路径 的题,最好使用 深度优先搜索。在搜索时,可以 把每个节点都看作“根节点”,在其左、右子树中分别寻找 减去本节点值的 剩余的 目标值。如果发现当前节点为 null,则代表当前路径不是题目要求的路径,返回 false;如果发现当前节点的子节点都为 null(说明该节点是 叶子节点),则查看本次要找的目标值是否等于当前节点的值,如果等于,则说明存在题目所要求的路径,返回 true

代码

class Solution {// 判断是否能以 curr 为根节点,找到节点值之和为 tar 的路径public boolean hasPathSum(TreeNode curr, int tar) {if (curr == null) { // 如果当前节点为 nullreturn false; // 则该路径不是题目所要求的路径,返回 false} else if (curr.left == null && curr.right == null) { // 如果当前节点的子节点都为 nullreturn tar == curr.val; // 则看 本次要找的值 是否等于 当前节点的值}// 分别在 左、右子树中,寻找节点值之和为 剩余的 tar 的路径return hasPathSum(curr.left, tar - curr.val)|| hasPathSum(curr.right, tar - curr.val);}
}

130. 被围绕的区域

题目链接

130. 被围绕的区域

标签

深度优先搜索 广度优先搜索 并查集 数组 矩阵

思路

题目描述挺抽象的,本题就是将被 'X' 围绕的一片 'O' 全部改成 'X',围绕的定义是这一片 'O' 的上下左右都有 'X',就像一个漂在水面上的小岛。本题很像 LeetCode 200. 岛屿数量,200题是求小岛的数量,而本题像是将小岛淹没(将这片岛屿从 'O' 改成 'X'),除了与边界连通的小岛之外。

我们可以反着想:对 与边界连通的小岛 做标记,那么没有被标记的小岛就是要被淹没的区域,在最后将标记取消,并将没有被标记的小岛淹没即可。

做标记很简单,由于被标记的小岛需要与边界连通,所以可以从 第一行、最后一行、第一列、最后一列 入手,使用 深度优先搜索 找到与边界的 'O' 所连通的区域,并对其进行标记。这里的深度优先搜索很简单,仅仅需要向上下左右搜索即可。

注意:本题的 'O' 是大写字母 'O',而不是数字 '0'

代码

class Solution {public void solve(char[][] board) {// 初始化成员变量this.board = board;this.ROW = board.length;this.COL = board[0].length;if (ROW == 0) { // 如果一行都没有return; // 则直接返回}// 标记与边界连通的小岛for (int r = 0; r < ROW; r++) {dfs(r, 0); // 遍历第一列dfs(r, COL - 1); // 遍历最后一列}for (int c = 1; c < COL - 1; c++) { // 由于上面的遍历将四角都遍历过了,所以跳过四角dfs(0, c); // 遍历第一行dfs(ROW - 1, c); // 遍历最后一行}// 取消标记、淹没没有标记的小岛for (int r = 0; r < ROW; r++) {for (int c = 0; c < COL; c++) {if (board[r][c] == 'U') { // 将被标记的方格改为 'O'board[r][c] = 'O';} else if (board[r][c] == 'O') { // 将没有被标记的方格 (被围绕) 改为 'X'board[r][c] = 'X';}}}}private void dfs(int r, int c) {if (!(r >= 0 && r < ROW && c >= 0 && c < COL) // 如果 (r, c) 指向的元素不在矩阵内|| board[r][c] != 'O') { // 或者 这个元素不是 大写字母 'O'return; // 则直接返回}board[r][c] = 'U'; // 标记方格,表示它不是被围绕的方格for (int k = 0; k < 4; k++) { // 分别向上下左右遍历int kr = r + dir[k][0], kc = c + dir[k][1];dfs(kr, kc);}}private int ROW; // 行数private int COL; // 列数private char[][] board; // 矩阵// 方向数组,分别为 向右、向下、向左、向上private int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
}

相关文章:

LeetCode 150, 112, 130

文章目录 150. 逆波兰表达式求值题目链接标签思路代码 112. 路径总和题目链接标签思路代码 130. 被围绕的区域题目链接标签思路代码 150. 逆波兰表达式求值 题目链接 150. 逆波兰表达式求值 标签 栈 数组 数学 思路 本题很像 JVM 中的 操作数栈&#xff0c;当写出以下三行…...

c++应用网络编程之五Windows常用的网络IO模型

一、Windows的网络编程 其实对开发者而言&#xff0c;只有Windows和其它平台。做为一种普遍流行的图形OS&#xff0c;其一定会与类Linux的编程有着明显的区别&#xff0c;这点当然也会体现在网络编程上。Windows有着自己一套相对独立的上层Socket编程模型或者说框架&#xff0…...

PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 PostgreSQL 中如何解决因大量并发删除和插入操作导致的索引抖动一、理解索引抖动二、索引抖动的影响三…...

鑫创SSS1700USB音频桥芯片USB转IIS芯片

鑫创SSS1700支持IIC初始外部编&#xff08;EEPROM选项),两线串行总线&#xff08;I2C总线&#xff09;用于外部MCU控制整个EEPROM空间可以通过MCU访问用于主机控制同步的USB HID外部串行EEPROM&#xff08;24C02~24C16&#xff09;接口&#xff0c;用于客户特定的USB视频、PID、…...

计算机视觉发展历程

文章目录 前言一、发展历程1&#xff09;、萌芽期&#xff08;1960s-1970s&#xff09;2&#xff09;、基础发展期&#xff08;1980s&#xff09;3&#xff09;、系统开发期&#xff08;1990s-2000s&#xff09;4&#xff09;、深度学习兴起期&#xff08;2010s&#xff09;5&a…...

从安装Node到TypeScript到VsCode的配置教程

从安装Node到TypeScript到VsCode的配置教程 1.下载Node安装包&#xff0c; 链接 2.双击安装包&#xff0c;选择安装路径&#xff0c;如下&#xff1a; 3.一直点击下一步&#xff0c;直至安装结束即可&#xff1a; 这个时候&#xff0c;node会默认配置好环境变量&#xff0c;并且…...

Jackson详解

文章目录 一、Jackson介绍二、基础序列化和反序列化1、快速入门2、序列化API3、反序列化API4、常用配置 三、常用注解1、JsonProperty2、JsonAlias3、JsonIgnore4、JsonIgnoreProperties5、JsonFormat6、JsonPropertyOrder 四、高级特性1、处理泛型1.1、反序列化List泛型1.2、反…...

【算法】字符串

快乐的流畅&#xff1a;个人主页 个人专栏&#xff1a;《算法神殿》《数据结构世界》《进击的C》 远方有一堆篝火&#xff0c;在为久候之人燃烧&#xff01; 文章目录 引言一、最长公共前缀二、最长回文子串三、二进制求和四、字符串相乘 引言 字符串题&#xff0c;大多数是模…...

Python酷库之旅-第三方库Pandas(037)

目录 一、用法精讲 116、pandas.Series.div方法 116-1、语法 116-2、参数 116-3、功能 116-4、返回值 116-5、说明 116-6、用法 116-6-1、数据准备 116-6-2、代码示例 116-6-3、结果输出 117、pandas.Series.truediv方法 117-1、语法 117-2、参数 117-3、功能 …...

iOS 左滑返回事件的控制

0x00 视图结构 1-根视图 1.1-控制器A 1.1.1-控制器B 1.1.1.1-控制器C 0x01 控制 通过设置 self.navigationController.interactivePopGestureRecognizer.enabled 为 YES 或 NO 来控制当面界面&#xff0c;是否能左滑返回 在 控制器B 的生命周期方法内&#xff0c;设置属性 s…...

= null 和 is null;SQL中关于NULL处理的4个陷阱;三值逻辑

一、概述 1、NULL参与的所有的比较和算术运算符(>,,<,<>,<,>,,-,*,/) 结果为unknown&#xff1b; 2、unknown的逻辑运算(AND、OR、NOT&#xff09;遵循三值运算的真值表&#xff1b; 3、如果运算结果直接返回用户&#xff0c;使用NULL来标识unknown 4、如…...

拖拽上传(预览图片)

需求 点击上传图片&#xff0c;或直接拖拽图片到红色方框里面也可上传图片&#xff0c;上传后预览图片 效果 实现 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content&…...

Oracle 12c新特性 In-Memory Column Store

Oracle 12c引入了一项重要的特性——In-Memory Column Store&#xff08;简称IM或In-Memory&#xff09;&#xff0c;这一特性极大地提升了数据库在处理分析型查询时的性能。以下是关于Oracle 12c In-Memory特性的详细介绍&#xff1a; 一、基本概念 In-Memory Column Store&…...

【数据结构】二叉树———Lesson2

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…...

mongodb数据导出与导入

一、先去检查mongodump mongodump --version 如果报 mongodump version: built-without-version-string 或者其他的较老的版本&#xff0c;直接去下载最新的【传送门】 【以Ubuntu18.04为例】 安装工具 假设你下载的是 .tgz 文件&#xff08;适用于 Linux 系统&#xff09;&am…...

电路学习——经典运放电路之滞回比较器(施密特触发器)(2024.07.18)

参考链接1: 电子设计教程29&#xff1a;滞回比较器&#xff08;施密特触发器&#xff09; 参考链接2: 滞回比较器电路详细分析 参考链接3: 比较器精髓&#xff1a;施密特触发器&#xff0c;正反馈的妙用 参考链接4: 比较器反馈电阻选多大&#xff1f;理解滞后效应&#xff0c;轻…...

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker)

NVIDIA Container Toolkit 安装与配置帮助文档(Ubuntu,Docker) 本文档详细介绍了在 Ubuntu Server 22.04 上使用 Docker 安装和配置 NVIDIA Container Toolkit 的过程。 概述 NVIDIA 容器工具包使用户能够构建和运行 GPU 加速容器。即可以在容器中使用NVIDIA显卡。 架构图如…...

JavaWeb day01-HTML入门

Web前端 课程安排 HTML、CSS简介 HTML快速入门 实现标题排版 新闻标题样式...

驱动框架——CMSIS第一部分 RTE驱动框架介绍

一、介绍CMISIS 什么是CMSIS&#xff08;cortex microcontrol software interface standard一种软件标准接口&#xff09;&#xff0c;官网地址&#xff1a;https://arm-software.github.io/CMSIS_6/latest/General/index.html 包含的core、driver、RTOS、dsp、nn等部分&…...

Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器

Debezium日常分享系列之:Debezium2.7版本PostgreSQL数据库连接器 一、概述二、连接器的工作原理安全快照初始快照的默认工作流程行为临时快照触发临时增量快照触发临时阻塞快照增量快照增量快照流程Debezium 如何解决具有相同主键的记录之间的冲突快照窗口触发增量快照具有附加…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...