Leetcode 3.18

Leetcode hot100

  • 二叉树
    • 1.路径总和 III
    • 2.路径总和 II
    • 3.二叉树的所有路径
    • 4.二叉树的最近公共祖先
  • 回溯
    • 1.电话号码的字母组合

二叉树

1.路径总和 III

路径总和 III
思路:我们访问每一个节点 node,检测以 node 为起始节点且向下延深的路径有多少种。递归遍历每一个节点的所有可能的路径,然后将这些路径数目加起来即为返回结果。
综上:递归是比较合适的方法。

当前层需要干什么:求出以当前 root 为节点向下遍历的和 == targetsum 的个数
rootSum(TreeNode* root, int targetSum)
以当前节点 p 为目标路径的起点递归向下进行搜索。假设当前的节点 p 的值为 val,我们对左子树和右子树进行递归搜索,对节点 p 的左孩子节点 pl 求出 rootSum(pl, targetSum−val)
以及对右孩子节点 pr 求出 rootSum(pr, targetSum−val)。节点 p 的 rootSum(p, targetSum)即等于 rootSum(pl,targetSum−val) + rootSum(pr,targetSum−val),同时我们还需要判断一下当前节点 p 的值是否刚好等于 targetSum。

/*** 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://以各个节点为根节点//root,root->left,root->right,root->left->left,root->left->right......int pathSum(TreeNode* root, int targetSum) {if (root == nullptr) return 0;return rootSum(root, targetSum) + pathSum(root->left, targetSum) + pathSum(root->right, targetSum);}//以当前节点为根节点,找到从当前节点向下遍历,节点相加和为target的次数int rootSum(TreeNode* root, long targetSum) {if (root == nullptr) return 0;int ret = 0;if (root->val == targetSum) ret++;ret += rootSum(root->left, targetSum - root->val);ret += rootSum(root->right, targetSum - root->val);return ret;}
};

2.路径总和 II

路径总和 II
虽然这道题不在hot100里,但是和上一道题很类似,该题是求所有 从根节点到叶子节点 路径总和等于给定目标和的路径。显然还是用递归的方法更合适。
我们可以递归遍历记录所有的路径,同时计算路径和,如果等于那么添加到最终的vector<vector< int >>中。

函数 dfs(TreeNode* root, int targetSum)

递推参数: 当前节点 root ,当前目标值 targetSum。
终止条件: 若节点 root 为空,则直接返回。
递推工作
路径更新: 将当前节点值 root->val 加入路径 vector<int>tmp
目标值更新: targetSum = targetSum - root->val (即目标值 targetSum 从 targetSum 减至 0 )。
路径记录: 当 (1) root 为叶节点(左右子树均为空) 且 (2) 路径和等于目标值(targetSum == 0),则将此路径 tmp 加入 ans 。
先序遍历: 递归左 / 右子节点。
路径恢复: 向上回溯前,需要将当前节点从路径 tmp 中删除,即执行 tmp.pop_back()

/*** 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<vector<int>> ans;vector<int> tmp;vector<vector<int>> pathSum(TreeNode* root, int targetSum) {if (root == nullptr) return ans;dfs(root, targetSum);return ans;}void dfs(TreeNode* root, int targetSum) {if (root == nullptr) return;tmp.push_back(root->val);targetSum -= root->val;if (root->left == nullptr && root->right == nullptr && targetSum == 0) {ans.push_back(tmp);}dfs(root->left, targetSum);dfs(root->right, targetSum);tmp.pop_back();}
};

在这里插入图片描述

在这里插入图片描述

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<string> ans;vector<string> binaryTreePaths(TreeNode* root) {if (root == nullptr) return ans;string tmp;dfs(root, tmp);return ans;}void dfs(TreeNode* root, string tmp) {if (root == nullptr) return;tmp += to_string(root->val);if (root->left == nullptr && root->right == nullptr) {ans.push_back(tmp);} else {tmp += "->";dfs(root->left, tmp);dfs(root->right, tmp);}}
};

4.二叉树的最近公共祖先

二叉树的最近公共祖先
终止条件:

  • 当 root 等于 p,q,则直接返回 root;

递推工作:

  • 开启递归左子节点,返回值记为 left;
  • 开启递归右子节点,返回值记为 right;

返回值:
根据 left 和 right,可展开为四种情况;

  • 当 left 和 right 同时为空 :说明 root 的左 / 右子树中都不包含 p,q,返回 null;
  • 当 left 和 right 同时不为空 :说明 p,q 分列在 root 的 异侧 (分别在 左 / 右子树),因此 root
    为最近公共祖先,返回 root ;
  • 当 left 为空 ,right 不为空 :p,q 都不在 root 的左子树中,直接返回 right。
    具体可分为两种情况:
    • p,q 其中 p 在 root 的 右子树 中,此时 right 指向 p(假设为 p );
    • p,q 两节点都在 root 的 右子树 中,此时的 right 指向 最近公共祖先节点 ;
  • 当 left 不为空 , right 为空 :与情况 3. 同理;
    参考
    在这里插入图片描述
/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {//找到p,找到q,或者已经到叶子节点还没找到if (root == nullptr || root == p || root == q) return root;//遍历左子树TreeNode* left = lowestCommonAncestor(root->left, p, q);//遍历右子树TreeNode* right = lowestCommonAncestor(root->right, p, q);//左右子树点都没找到if (left == nullptr && right == nullptr) return nullptr;//右边没有p或者q,left要么是p/q,或者是p/q的公共祖先if (left != nullptr && right == nullptr) return left;if (right != nullptr && left == nullptr) return right;return root;}
};

回溯

1.电话号码的字母组合

电话号码的字母组合
电话号码的组合就是输入字符对应字符串的全排列,全排列的问题应该用回溯解决。
遍历输入的字符串;
找出对应字符映射的字母;
遍历映射字母;
添加到tmp string中,进行递归;
tmp string 剪枝。
在这里插入图片描述

class Solution {
public:unordered_map<char, string> mp = {{'2', {"abc"}},{'3', {"def"}},{'4', {"ghi"}},{'5', {"jkl"}},{'6', {"mno"}},{'7', {"pqrs"}},{'8', {"tuv"}},{'9', {"wxyz"}}};vector<string> ans;vector<string> letterCombinations(string digits) {if (digits.empty()) return ans;string tmp;dfs(digits, 0, tmp);return ans;}void dfs(string digits, int index, string& tmp) {if (index == digits.length()) {ans.push_back(tmp);} else {//遍历输入的数字char digit = digits[index];//找到数字对应的stringstring letters = mp[digit];//遍历数字对应的charfor (char c: letters) {//添加到stringtmp.push_back(c);//递归dfs(digits, index + 1, tmp);tmp.pop_back();}}   }
};

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

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

相关文章

【ACL2023获奖论文】比你想的更弱:对弱监督学习的批判性审视

【ACL 2023获奖论文】主题论文奖&#xff1a;7.Weaker Than You Think: A Critical Look at Weakly Supervised Learning 写在最前面引言正文问题1&#xff1a;对WSL来说&#xff0c;clean data是否必要&#xff1f;问题2&#xff1a;WSL需要多少的clean data&#xff1f;问题3…

elasticsearch基础学习

elasticsearch简介 什么是elasticsearch elasticsearch&#xff08;简称es&#xff09;&#xff0c;其核心是 Elastic Stack&#xff0c;es是一个基于 Apache Lucene&#xff08;TM&#xff09;的开源的高扩展的分布式全文检索引擎&#xff0c;它可以近乎实时的存储、检索数据…

如何在开放麒麟系统安装cpolar内网穿透实现公网环境下SSH远程连接

文章目录 1. 安装SSH服务2. 本地SSH连接测试3. openKylin安装Cpolar4. 配置 SSH公网地址5. 公网远程SSH连接小结 6. 固定SSH公网地址7. SSH固定地址连接 openKylin是中国首个基于Linux 的桌面操作系统开发者平台&#xff0c;通过开放操作系统源代码的方式&#xff0c;打造具有自…

裸金属租赁的意义

裸金属&#xff0c;这个名词听起来好“硬核”&#xff0c;如果对于一个新手来讲&#xff0c;怎么也不会将这个概念和IT行业、计算机、服务器等内容进行关联&#xff0c;它可能更应该是工业领域的一种产品或者物质&#xff0c;可真正关联到其实际概念恰恰与当前的主流行业如&…

论文阅读——Align before Fuse

Align before Fuse: Vision and Language Representation Learning with Momentum Distillation image-text contrastive learning(ITC)用在单模态&#xff0c;masked language modeling (MLM) and image-text matching (ITM) 用在多模态。 单模态编码器的表示上引入了中间图像…

机器学习中的基础问题总结

介绍&#xff1a;总结面试经常问到的一些机器学习知识点&#xff08;必会&#x1f31f;&#xff09; 基础知识点梳理 模型评估一、L1、L2正则化1、L1正则与L2正则有何不同&#xff1f;2、为什么正则化可以防止过拟合&#xff1f;3、为什么L1正则具有稀疏性&#xff1f;&#xf…

JMeter之IP欺骗技术(模拟不同的IP地址并发请求)

我们在做压力测试时&#xff0c;有这样的场景和需求&#xff0c;希望模拟的批量用户来自不同的IP地址。如果小伙伴用LR是很容易实现的&#xff0c;用IP欺骗即可实现。那么对于用JMeter小伙伴是不是就不能享受这一技术了呢&#xff0c;答案是否定的&#xff0c;JMeter一样可以实…

【晴问算法】入门篇—贪心算法—整数配对

题目描述 有两个正整数集合S、T&#xff0c;其中S中有n个正整数&#xff0c;T中有m个正整数。定义一次配对操作为&#xff1a;从两个集合中各取出一个数a和b&#xff0c;满足a∈S、b∈T、a≤b&#xff0c;配对的数不能再放回集合。问最多可以进行多少次这样的配对操作。 输入描…

Elasticsearch:调整近似 kNN 搜索

在我之前的文章 “Elasticsearch&#xff1a;调整搜索速度”&#xff0c;我详细地描述了如何调整正常的 BM25 的搜索速度。在今天的文章里&#xff0c;我们来进一步探讨如何提高近似 kNN 的搜索速度。希望对广大的向量搜索开发者有一些启示。 Elasticsearch 支持近似 k 最近邻…

一、yocto 编译raspberrypi 4B并启动

yocto 编译raspberrypi 4B并启动 yocto 编译raspberrypi 4B并启动环境准备代码下载编译及配置烧录 yocto 编译raspberrypi 4B并启动 本篇文章为基于raspberrypi 4B单板的yocto实战系列的开篇之作。 环境准备 最近到手一个树莓派4B&#xff0c;准备拿来玩一玩&#xff0c;下面…

Docker部署Django项目——基础

1.服务器配置 1.1centos7 系统的安装 centos-7-isos-x86_64安装包下载) VMware安装自定义配置 选择对应的系统镜像 一般选择内核4核、内存8g、硬盘80g 相关配置 1.2.网络配置 1.2.1查看win电脑虚拟机VMnet8的ip 使用ipconfig查看虚拟机的ip 1.2.2配置虚拟机VMnet8的ip…

152.乐理基础-广义的、实际的原位与转位、转位的意义

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;151.和弦固定标记法&#xff08;二&#xff09;转位和弦&#xff0c;斜杠&#xff08;slash&#xff09;和弦 上一个内容里练习的答案&#xff1a;斜杠左边的有多个写法&#xff0c;如果与下图不一样&#xff0c;那…

小白向-使用git实现不同服务器改动的同步

背景 深度学习项目&#xff0c;已有可运行的backbone&#xff0c;已将此项目在github建库。 需要使用不同分支进行不同改动的测试&#xff1b;有两台服务器可供程序运行&#xff1b; 项目需求 以github云端仓库为媒介&#xff0c;实现不同服务器改动无痛关联。维护项目代码…

WRF模型安装教程(ububtu系统)-- III.WRF和WPS模型的安装

六、WRF模型的安装 # 进入Build_WRF文件夹 cd Build_WRF # 下载WRFV3.9.1 wget https://www2.mmm.ucar.edu/wrf/src/WRFV4.0.TAR.gz # 解压WRF安装包并进入 tar -zxvf WRFV4.0.TAR.gz cd WRF # 安装WRF ./configure 出现如下选项&#xff1a; 选择34&#xff0c; 这里是让你选…

FREERTOS任务调度和切换

我们已经学会了 FreeRTOS 的任务创建和删除&#xff0c;挂起和恢复等基本操作&#xff0c;并且也学习了分析FreeRTOS 源码所必须掌握的知识&#xff1a;列表和列表项。但是任务究竟如何被创建、删除、挂起和恢复的&#xff1f;系统是怎么启动的等等这些我们还不了解&#xff0c…

windows使用docker运行TP6使用swoole内置http服务

1&#xff0c;下载docker-Windows客户端 下载地址&#xff1a;https://www.docker.com/products/docker-desktop docker --version #查看docker版本 docker-compose --version #查看docker-compose版本 2&#xff0c;安装环境 使用一键安装包&#xff1a;https://gitee.com/yes…

汇总全网免费API,持续更新(新闻api、每日一言api、音乐。。。)

Public&FreeAPI 网址&#xff1a;apis.whyta.cn &#xff08;推荐&#xff09; UomgAPI 网址&#xff1a;https://api.uomg.com 教书先生 网址&#xff1a;https://api.oioweb.cn/ 山海API https://api.shserve.cn/ 云析API铺 https://api.a20safe.com/ 韩小韩…

深度学习pytorch——基本数据类型创建Tensor(持续更新)

声明&#xff1a;本深度学习笔记基于课时18 索引与切片-1_哔哩哔哩_bilibili学习而来 All is about Tensor 定义&#xff1a;Tensors are simply mathematical objects that can be used to describe physical properties, just like scalars and vectors. In fact tensors a…

day6 3/18

2.试编程&#xff1a; 封装一个动物的基类&#xff0c;类中有私有成员&#xff1a;姓名&#xff0c;颜色&#xff0c;指针成员年纪 再封装一个狗这样类&#xff0c;共有继承于动物类&#xff0c;自己拓展的私有成员有&#xff1a;指针成员&#xff1a;腿的个数&#xff08;整…

JAVA实战开源项目:天然气工程业务管理系统(Vue+SpringBoot)

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…