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

【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,j1] 维护的是全是 0 0 0 的区间, [ j , i − 1 ] [j,i - 1] [j,i1] 维护的是全是 1 1 1 的区间, [ k + 1 , n − 1 ] [k + 1,n - 1] [k+1,n1] 维护的是全是 2 2 2 的区间,而 [ i , k ] [i,k] [i,k] 区间的元素是还没放的数。

枚举整个数组,若当前枚举到的位置是 i i i

  1. nums[i] == 0,则交换 i i i j j j 的位置的元素,由于nums[i] == 0且nums[j] == 1,因此交换后 i i i j j j 同时往后移动1位;
  2. nums[i] == 1,则直接 i ++
  3. 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. 思路分析

单调栈

  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 低。
  3. 满足 操作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 n1 个节点,将这 n − 1 n - 1 n1 个节点分配在根节点的两侧,即可构造出所有的方案。

状态表示: f [ n ] f[n] f[n] 表示 n n n 个节点的二叉搜索树共有多少种。
状态转移: 左子树可以有 0 , 1 , . . . , n − 1 0,1,...,n - 1 0,1,...,n1 个节点,对应的右子树有 n − 1 , n − 2 , . . . , 0 n - 1, n - 2, ..., 0 n1,n2,...,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[n1]+f[1]f[n2]++f[n1]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. 思路分析

递归判断两个子树是否互为镜像。

两个子树互为镜像当且仅当:

  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

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…...

rust中的超时处理

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

DML语言(重点)———update

格式&#xff1a;update 要修改的对象 set 原来的值新值 -- 修改学员名字,带了简介 代码案例&#xff1a; -- 修改学员名字,带了简介 UPDATE student SET name清宸 WHERE id 1; -- 不指定条件情况下&#xff0c;会改动所有表&#xff01; 代码案例…...

Mybatis使用详解

简介 MyBatis是一款优秀的持久层框架&#xff0c;它支持普通SQL查询&#xff0c;存储过程和高级映射。MyBatis通过简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJOs&#xff08;Plain Ordinary Java Object&#xff0c;普通的Java对象&#xff09;映射成数据…...

云原生周刊:Karmada 成为 CNCF 孵化项目 | 2023.12.25

开源项目推荐 kubernetes-reflector Reflector 是一个 Kubernetes 的插件&#xff0c;旨在监视资源&#xff08;secrets 和 configmaps&#xff09;的变化&#xff0c;并将这些变化反映到同一命名空间或其他命名空间中的镜像资源中。 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 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP&#xff0c;子网掩码&#xff0c;网关和DNS。 11.1.1 IP地址 在计算机中对IP的标记使用的是32bit的二进制&#xff0c;例如&#xff0c; 11000000 10101000 00…...

Qt如何在控制台项目中使用opencv打开视频

Qt如何在控制台项目中使用opencv打开视频&#xff1f; 重要代码&#xff1a; 1、在pro文件中这样设置&#xff1a; QT - gui QT core widgets serialport 2、不要继承和使用&#xff1a;QCoreApplication #include pro文件&#xff1a; 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&#xff08;Node Package Manager&#xff09;是一个用于管理 JavaScript 包…...

vue利用深拷贝解决修改不能取消的问题

vue利用深拷贝解决修改不能取消的问题 在对某数据进行修改时考虑还需要进行“确认”、“取消”操作&#xff0c;那么在取消时就需要返回保留的数据内容&#xff0c;那么如何将原有数据保留一份则是关键性问题。 显然修改值不能直接进行原值的赋值操作&#xff0c;因为这样无法取…...

MATLAB - 使用 YOLO 和基于 PCA 的目标检测,对 UR5e 的半结构化智能垃圾箱拣选进行 Gazebo 仿真

系列文章目录 前言 本示例展示了在 Gazebo 中使用 Universal Robots UR5e cobot 模拟智能垃圾桶拣选的详细工作流程。本示例提供的 MATLAB 项目包括初始化、数据生成、感知、运动规划和积分器模块&#xff08;项目文件夹&#xff09;&#xff0c;可创建完整的垃圾桶拣选工作流…...

个性化定制的知识付费小程序,为用户提供个性化的知识服务,知识付费saas租户平台

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

基于flask和echarts的新冠疫情实时监控系统源码+数据库,后端基于python的flask框架,前端主要是echarts

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

总结js中遍历对象属性的方法

方法介绍 1、 forin循环&#xff1a;遍历对象自身的和原型链上的可枚举属性。 2、Object.getOwnPropertySymbols()方法&#xff1a;返回一个数组&#xff0c;包含对象自身的所有Symbol类型的属性。 3、 Object.getOwnPropertyNames()方法&#xff1a;返回一个数组&#xff0…...

编写fastapi接口服务

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

RasaGPT对话系统的工作原理

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

C++设计模式 #7 工厂方法(Factory Method)

“对象创建”模式 通过“对象创建”模式绕开new&#xff0c;来避免对象创建&#xff08;new&#xff09;过程中所导致的紧耦合&#xff08;依赖具体类&#xff09;&#xff0c;从而支持创建的稳定。它是接口抽象之后的第一步工作。 动机 在软件系统中&#xff0c;经常面临着创…...

信息网络协议基础-接入网技术

文章目录 概述***基于ATM架构虚电路PVC和SVC信元格式为什么信元格式由AAL决定?网络架构传统电信网络:点对点链路PPP协议协议内容消息过程多协议封装功能电话网接入Internet(DSL 数字用户线路)主要接入技术ADSL关键技术DMTDSLAM体系结构PPPOE帧格式过程特点局域网定义参考模型L…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么&#xff1f;它的作用是什么&#xff1f; Spring框架的核心容器是IoC&#xff08;控制反转&#xff09;容器。它的主要作用是管理对…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

鸿蒙HarmonyOS 5军旗小游戏实现指南

1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;采用DevEco Studio实现&#xff0c;包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...

虚拟机网络不通的问题(这里以win10的问题为主,模式NAT)

当我们网关配置好了&#xff0c;DNS也配置好了&#xff0c;最后在虚拟机里还是无法访问百度的网址。 第一种情况&#xff1a; 我们先考虑一下&#xff0c;网关的IP是否和虚拟机编辑器里的IP一样不&#xff0c;如果不一样需要更改一下&#xff0c;因为我们访问百度需要从物理机…...

python数据结构和算法(1)

数据结构和算法简介 数据结构&#xff1a;存储和组织数据的方式&#xff0c;决定了数据的存储方式和访问方式。 算法&#xff1a;解决问题的思维、步骤和方法。 程序 数据结构 算法 算法 算法的独立性 算法是独立存在的一种解决问题的方法和思想&#xff0c;对于算法而言&a…...

旋量理论:刚体运动的几何描述与机器人应用

旋量理论为描述刚体在三维空间中的运动提供了强大而优雅的数学框架。与传统的欧拉角或方向余弦矩阵相比&#xff0c;旋量理论通过螺旋运动的概念统一了旋转和平移&#xff0c;在机器人学、计算机图形学和多体动力学领域具有显著优势。这种描述不仅几何直观&#xff0c;而且计算…...