【LeetCode 热题 HOT 100】题解笔记 —— Day04
❤ 作者主页:欢迎来到我的技术博客😎
❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~*
🍊 如果文章对您有帮助,记得关注、点赞、收藏、评论⭐️⭐️⭐️
📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉
文章目录
- 一、颜色分类
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 二、最小覆盖子串
- 1. 题目描述
- 2. 思路分析
- 三、子集
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 四、单词搜索
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 五、柱状图中最大的矩形
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 六、最大矩阵
- 七、二叉树的中序遍历
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 八、不同的二叉搜索树
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 九、验证二叉搜索树
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
- 十、对称二叉树
- 1. 题目描述
- 2. 思路分析
- 3. 代码实现
一、颜色分类
1. 题目描述
2. 思路分析
这道题的思路很难可以想到。
如图所示, [ 0 , j − 1 ] [0,j - 1] [0,j−1] 维护的是全是 0 0 0 的区间, [ j , i − 1 ] [j,i - 1] [j,i−1] 维护的是全是 1 1 1 的区间, [ k + 1 , n − 1 ] [k + 1,n - 1] [k+1,n−1] 维护的是全是 2 2 2 的区间,而 [ i , k ] [i,k] [i,k] 区间的元素是还没放的数。
枚举整个数组,若当前枚举到的位置是 i i i:
- 若
nums[i] == 0
,则交换 i i i 和 j j j 的位置的元素,由于nums[i] == 0且nums[j] == 1
,因此交换后 i i i 和 j j j 同时往后移动1位; - 若
nums[i] == 1
,则直接i ++
; - 若
nums[i] == 2
,则交换 i i i 和 k k k 位置的元素,由于nums[i] == 2
,因此填入到 k k k 位置时, k k k 的元素就是2,因此 k k k 需要往前移动1位,而交换过来可能是2 也可能是0 而i的元素未知,不做移动。
3. 代码实现
class Solution {
public:void sortColors(vector<int>& nums) {for (int i = 0, j = 0, k = nums.size() - 1; i <= k;) {if (nums[i] == 0) swap(nums[i ++], nums[j ++]);else if (nums[i] == 2) swap(nums[i], nums[k --]);else i ++;}}
};
二、最小覆盖子串
1. 题目描述
2. 思路分析
三、子集
1. 题目描述
2. 思路分析
dfs
和全排列的做法一样,当我们走到叶子结点时,就把该路径加入方案中。如果还没有走到叶子节点,那么对于枚举的当前数,我们有两种选择,选或不选,做出选择再递归到下一层,同时记得回溯。
3. 代码实现
class Solution {
public:vector<vector<int>> res;vector<int> path;vector<vector<int>> subsets(vector<int>& nums) {dfs(nums, 0);return res;}void dfs(vector<int> nums, int u) {if (u >= nums.size()) {res.push_back(path);return;}dfs(nums, u + 1); // 不选当前数,递归下一层path.push_back(nums[u]); // 选当前数dfs(nums, u + 1); // 递归path.pop_back(); // 回溯}
};
四、单词搜索
1. 题目描述
2. 思路分析
(dfs)
在深度优先搜索中,最重要的就是考虑好搜索顺序。
我们先枚举单词的起点,然后依次枚举单词的每个字母。
过程中需要将已经使用过的字母改成一个特殊字母,以避免重复使用字符。
3. 代码实现
class Solution {
public:bool exist(vector<vector<char>>& board, string word) {for (int i = 0; i < board.size(); i ++) {for (int j = 0; j< board[i].size(); j ++) {if (dfs(board, word, 0, i, j)) return true;}}return false;}int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};bool dfs(vector<vector<char>>& board, string& word, int u, int x, int y) {if (board[x][y] != word[u]) return false;if (u == word.size() - 1) return true;char t = board[x][y];board[x][y] = '.';for ( int i = 0; i < 4; i ++) {int a = x + dx[i], b = y + dy[i];if (a < 0 || a >= board.size() || b < 0 || b >= board[0].size() || board[a][b] == '.') continue;if (dfs(board, word, u + 1, a, b)) return true;}board[x][y] = t;return false;}
};
五、柱状图中最大的矩形
1. 题目描述
2. 思路分析
单调栈
- 此题的本质是找到每个柱形条左边和右边最近的比自己低的矩形条,然后用宽度乘上当前柱形条的高度作为备选答案。
- 解决此类问题的经典做法是单调栈,维护一个单调递增的栈,如果当前柱形条 i i i 的高度比栈顶要低,则栈顶元素 c u r cur cur 出栈。出栈后, c u r cur cur 右边第一个比它低的柱形条就是 i,左边第一个比它低的柱形条是当前栈中的 t o p top top。不断出栈直到栈为空或者柱形条 i i i 不再比 t o p top top 低。
- 满足 操作2 之后,当前矩形条 i i i 进栈。
3. 代码实现
class Solution {
public:int largestRectangleArea(vector<int>& h) {int n = h.size();vector<int> left(n), right(n);stack<int> stk;for (int i = 0; i < n; i ++) {while (stk.size() && h[stk.top()] >= h[i]) stk.pop();if (stk.empty()) left[i] = -1;else left[i] = stk.top();stk.push(i);}stk = stack<int>();for (int i = n - 1; i >= 0; i --) {while (stk.size() && h[stk.top()] >= h[i]) stk.pop();if (stk.empty()) right[i] = n;else right[i] = stk.top();stk.push(i);}int res = 0;for (int i = 0; i < n; i ++) {res = max(res, h[i] * (right[i] - left[i] - 1));}return res;}
};
六、最大矩阵
七、二叉树的中序遍历
1. 题目描述
2. 思路分析
递归算法比较简单,就根据中序遍历的过程,先遍历左子树,再遍历当前根,然后遍历右子树。递归函数的中止条件是当前结点为空,同时当遍历当前结点时,将该点加入遍历数组即可。
3. 代码实现
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:vector<int> res;vector<int> inorderTraversal(TreeNode* root) {dfs(root);return res;}void dfs(TreeNode* root) {if (!root) return;dfs(root->left);res.push_back(root->val);dfs(root->right);}
};
八、不同的二叉搜索树
1. 题目描述
2. 思路分析
(动态规划)
对于 n n n 个节点的 BST,除去根节点有 n − 1 n - 1 n−1 个节点,将这 n − 1 n - 1 n−1 个节点分配在根节点的两侧,即可构造出所有的方案。
状态表示: f [ n ] f[n] f[n] 表示 n n n 个节点的二叉搜索树共有多少种。
状态转移: 左子树可以有 0 , 1 , . . . , n − 1 0,1,...,n - 1 0,1,...,n−1 个节点,对应的右子树有 n − 1 , n − 2 , . . . , 0 n - 1, n - 2, ..., 0 n−1,n−2,...,0 个节点, f [ n ] f[n] f[n] 是所有这些情况的总和,即 f [ n ] = f [ 0 ] ∗ f [ n − 1 ] + f [ 1 ] ∗ f [ n − 2 ] + … + f [ n − 1 ] ∗ f [ 0 ] f[n]=f[0]∗f[n−1]+f[1]∗f[n−2]+…+f[n−1]∗f[0] f[n]=f[0]∗f[n−1]+f[1]∗f[n−2]+…+f[n−1]∗f[0]
3. 代码实现
class Solution {
public:int numTrees(int n) {vector<int> f(n + 1);f[0] = 1;for (int i = 1; i <= n; i ++) for (int j = 1; j <= i; j ++)f[i] += f[j - 1] * f[i - j];return f[n];}
};
九、验证二叉搜索树
1. 题目描述
2. 思路分析
(深度优先遍历)
深度优先遍历整棵子树。
遍历时,需要向上传递当前子树中的最小值和最大值,这里可以用C++中的引用来专递。
对于当前节点,我们先遍历它的左子树,判断左子树是否合法,同时判断左子树的最大值是否小于当前节点的值;然后遍历右子树,判断右子树是否合法,同时判断右子树的最小值是否大于当前节点的值。
如果条件均满足,说明以当前节点为根的子树是一棵合法的二叉搜索树,返回 t r u e true true。
3. 代码实现
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isValidBST(TreeNode* root) {if (!root) return true;int maxv, minv;return dfs(root, maxv, minv);}bool dfs(TreeNode* root, int &maxv, int &minv) {maxv = minv = root->val;if (root->left) {int nowMaxv, nowMinv;if (!dfs(root->left, nowMaxv, nowMinv)) return false;if (nowMaxv >= root->val)return false;maxv = max(maxv, nowMaxv);minv = min(minv, nowMinv);}if (root->right) {int nowMaxv, nowMinv;if (!dfs(root->right, nowMaxv, nowMinv)) return false;if (nowMinv <= root->val)return false;maxv = max(maxv, nowMaxv);minv = min(minv, nowMinv);}return true;}
};
十、对称二叉树
1. 题目描述
2. 思路分析
递归判断两个子树是否互为镜像。
两个子树互为镜像当且仅当:
- 两个子树的根节点值相等;
- 第一棵子树的左子树和第二棵子树的右子树互为镜像,且第一棵子树的右子树和第二棵子树的左子树互为镜像;
3. 代码实现
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:bool isSymmetric(TreeNode* root) {if (!root) return true;return dfs(root->left, root->right);}bool dfs(TreeNode* p, TreeNode* q) {if (!p && !q) return true;if (!p || !q || p->val != q->val) return false;return dfs(p->left, q->right) && dfs(p->right, q->left);}
};
非常感谢您阅读到这里,如果这篇文章对您有帮助,希望能留下您的点赞👍 关注💖 分享👥 留言💬thanks!!!
相关文章:

【LeetCode 热题 HOT 100】题解笔记 —— Day04
❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…...

rust中的超时处理
rust中的超时处理 自从 tokio 1.0发布以来,rust的异步开发总算大势已定。尽管没达到标准库的速度,依然挡不住大家的热情。看编程排行榜,增加2倍的开发者。 既生瑜何生亮,感觉go就是小号的rust。 不废话了。背景:之前…...

DML语言(重点)———update
格式:update 要修改的对象 set 原来的值新值 -- 修改学员名字,带了简介 代码案例: -- 修改学员名字,带了简介 UPDATE student SET name清宸 WHERE id 1; -- 不指定条件情况下,会改动所有表! 代码案例…...
Mybatis使用详解
简介 MyBatis是一款优秀的持久层框架,它支持普通SQL查询,存储过程和高级映射。MyBatis通过简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plain Ordinary Java Object,普通的Java对象)映射成数据…...
云原生周刊:Karmada 成为 CNCF 孵化项目 | 2023.12.25
开源项目推荐 kubernetes-reflector Reflector 是一个 Kubernetes 的插件,旨在监视资源(secrets 和 configmaps)的变化,并将这些变化反映到同一命名空间或其他命名空间中的镜像资源中。 Lingo Lingo 是适用于 K8s 的 OpenAI 兼…...

【开源】基于JAVA的学校热点新闻推送系统
目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…...

Java基于TCP网络编程的群聊功能
服务端 import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List;public class Server2 {public static List<Socket> onlineList new ArrayList<>();public static void main(String[] args) throws Except…...
CentOS+ISCSI
九、配置iSCSI 添加1块大小为10G的虚拟硬盘; 安装iSCSI服务端targetcli; 使用新增加的硬盘创建卷组,名称为iscsivg,再创建iSCSI共享逻辑卷,逻辑 卷名称为iscsistore,大小为5G; 使用上述逻辑卷创建后端存储,名称为serverc.iscsistore; 定义iSCSI的IQN为iqn.2022-…...

RHCE9学习指南 第11章 网络配置
11.1 网络基础知识 一台主机需要配置必要的网络信息,才可以连接到互联网。需要的配置网络信息包括IP,子网掩码,网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制,例如, 11000000 10101000 00…...
Qt如何在控制台项目中使用opencv打开视频
Qt如何在控制台项目中使用opencv打开视频? 重要代码: 1、在pro文件中这样设置: QT - gui QT core widgets serialport 2、不要继承和使用:QCoreApplication #include pro文件: cpp QT - gui QT core widgets seria…...
Node.js 默认包管理器 npm 详解
目录 npm 概念 npm 命令 npm init npm install npm update npm uninstall npm search npm run other npm 安装 yarn npm 安装 yarn 和 npm 安装项目依赖 websocket 本质区别 npm 概念 npm(Node Package Manager)是一个用于管理 JavaScript 包…...
vue利用深拷贝解决修改不能取消的问题
vue利用深拷贝解决修改不能取消的问题 在对某数据进行修改时考虑还需要进行“确认”、“取消”操作,那么在取消时就需要返回保留的数据内容,那么如何将原有数据保留一份则是关键性问题。 显然修改值不能直接进行原值的赋值操作,因为这样无法取…...

MATLAB - 使用 YOLO 和基于 PCA 的目标检测,对 UR5e 的半结构化智能垃圾箱拣选进行 Gazebo 仿真
系列文章目录 前言 本示例展示了在 Gazebo 中使用 Universal Robots UR5e cobot 模拟智能垃圾桶拣选的详细工作流程。本示例提供的 MATLAB 项目包括初始化、数据生成、感知、运动规划和积分器模块(项目文件夹),可创建完整的垃圾桶拣选工作流…...

个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台
明理信息科技知识付费saas租户平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和…...

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts
介绍 基于flask和echarts的新冠疫情实时监控系统 软件架构 后端基于python的flask框架,前端主要是echarts 安装教程 下载到本地,在python相应环境下运行app.py,flask项目部署请自行完成 使用说明 flaskProject文件夹中 app.py是flask项目主运行文…...

总结js中遍历对象属性的方法
方法介绍 1、 forin循环:遍历对象自身的和原型链上的可枚举属性。 2、Object.getOwnPropertySymbols()方法:返回一个数组,包含对象自身的所有Symbol类型的属性。 3、 Object.getOwnPropertyNames()方法:返回一个数组࿰…...

编写fastapi接口服务
FastAPI是一个基于 Python 的后端框架,该框架鼓励使用 Pydantic 和 OpenAPI (以前称为 Swagger) 进行文档编制,使用 Docker 进行快速开发和部署以及基于 Starlette 框架进行的简单测试。 step1:安装必要库 pip install fastapi uvicorn st…...

RasaGPT对话系统的工作原理
RasaGPT 结合了 Rasa 和 Langchain 这 2 个开源项目,当超出 Rasa 现有意图(out_of_scope)的时候,就会执行 ActionGPTFallback,本质上就是利用 Langchain 做了一个 RAG,调用 LLM API。RasaGPT 涉及的技术栈比较多而复杂,…...

C++设计模式 #7 工厂方法(Factory Method)
“对象创建”模式 通过“对象创建”模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中,经常面临着创…...
信息网络协议基础-接入网技术
文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...
命令行关闭Windows防火墙
命令行关闭Windows防火墙 引言一、防火墙:被低估的"智能安检员"二、优先尝试!90%问题无需关闭防火墙方案1:程序白名单(解决软件误拦截)方案2:开放特定端口(解决网游/开发端口不通)三、命令行极速关闭方案方法一:PowerShell(推荐Win10/11)方法二:CMD命令…...

轻量级Docker管理工具Docker Switchboard
简介 什么是 Docker Switchboard ? Docker Switchboard 是一个轻量级的 Web 应用程序,用于管理 Docker 容器。它提供了一个干净、用户友好的界面来启动、停止和监控主机上运行的容器,使其成为本地开发、家庭实验室或小型服务器设置的理想选择…...