Leetcode秋招冲刺(专题13--15)

专题13:广度优先搜索

题目559:N叉树的最大深度(YES)

  • 解题思路:使用广度优先搜索,广度优先搜索的核心就是使用队列queue存储每个根节点,然后再存储孩子节点。

给定一个 N 叉树,找到其最大深度。

最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。

N 叉树输入按层序遍历序列化表示,每组子节点由空值分隔(请参见示例)。

/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:int maxDepth(Node* root) {if(root==NULL){return 0;}//使用广度优先搜索,核心的点就是使用队列queue<Node*>que;que.push(root);int high=0;//不为空,就继续while(!que.empty()){int size =que.size();for(int i=0;i<size;i++){Node*front=que.front();que.pop();//出队//添加孩子节点int children_size=front->children.size();for(int j=0;j<children_size;j++){que.push(front->children[j]);}}high++;}return high;}
};

题目617:合并二叉树(NO)

  • 解题思路:这题得用深度优先搜索,广度优先所搜过于繁琐。

给你两棵二叉树: root1 和 root2 。

想象一下,当你将其中一棵覆盖到另一棵之上时,两棵树上的一些节点将会重叠(而另一些不会)。你需要将这两棵树合并成一棵新二叉树。合并的规则是:如果两个节点重叠,那么将这两个节点的值相加作为合并后节点的新值;否则,不为 null 的节点将直接作为新二叉树的节点。

返回合并后的二叉树。

注意: 合并过程必须从两个树的根节点开始。

/*** 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:TreeNode* mergeTrees(TreeNode* t1, TreeNode* t2) {if (t1 == nullptr) {return t2;}if (t2 == nullptr) {return t1;}auto merged = new TreeNode(t1->val + t2->val);merged->left = mergeTrees(t1->left, t2->left);merged->right = mergeTrees(t1->right, t2->right);return merged;}
};

题目965:单值二叉树(YES)

  • 解题思路:使用二叉树的遍历算法进行判断就行,我这里用的是前序遍历,其实使用广度优先搜索也一样。

如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。

只有给定的树是单值二叉树时,才返回 true;否则返回 false。

/*** 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:void preorder(TreeNode*root,int ans,bool &sign){if(root==NULL){return ;}if(root->val!=ans){sign=false;}preorder(root->left,ans,sign);preorder(root->right,ans,sign);}bool isUnivalTree(TreeNode* root) {//使用二叉树的遍历算法即可,这里用二叉树的前序遍历int ans=root->val;bool sign=true;preorder(root,ans,sign);return sign;}
};

题目637:二叉树的层平均值(YES)

  • 解题思路:使用层序遍历也就是广度优先搜索即可

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

/*** 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<double> averageOfLevels(TreeNode* root) {//使用层序遍历,也就是广度优先搜索就行queue<TreeNode*>que;que.push(root);vector<double>ans;while(!que.empty()){int size=que.size();double sum=0;for(int i=0;i<size;i++){TreeNode*front=que.front();que.pop();sum+=front->val;//将孩子节点入队if(front->left!=NULL){que.push(front->left);}if(front->right!=NULL){que.push(front->right);}}ans.push_back(sum/size);}return ans;}
};

题目175:计算二叉树的深度(YES)

  • 解题思路:使用层序遍历

某公司架构以二叉树形式记录,请返回该公司的层级数。

  • myself
/*** 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:int calculateDepth(TreeNode* root) {//使用层序遍历if(root==NULL){return 0;}queue<TreeNode*>que;que.push(root);int ans=0;while(!que.empty()){int size=que.size();ans++;for(int i=0;i<size;i++){TreeNode*front=que.front();que.pop();//将孩子节点入队if(front->left!=NULL){que.push(front->left);}if(front->right!=NULL){que.push(front->right);}}}return ans;}
};

题目1379:找出克隆二叉树中的相同节点(YES)

  • 解题思路:这里我使用的是二叉树的遍历算法,使用前序遍历,当找到original时候,也就找到了cloned的目标节点。这题我刚开始犯了一个很经典的错误。

给你两棵二叉树,原始树 original 和克隆树 cloned,以及一个位于原始树 original 中的目标节点 target。

其中,克隆树 cloned 是原始树 original 的一个 副本 。

请找出在树 cloned 中,与 target 相同 的节点,并返回对该节点的引用(在 C/C++ 等有指针的语言中返回 节点指针,其他语言返回节点本身)。

注意:你 不能 对两棵二叉树,以及 target 节点进行更改。只能 返回对克隆树 cloned 中已有的节点的引用。

  • 刚开始的错误代码:
/*** 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:void preorder(TreeNode*original,TreeNode*cloned,TreeNode*target,TreeNode*ans){//前序遍历if(original==NULL&&cloned==NULL) return ;if(original==target) ans=cloned;preorder(original->left,cloned->left,target,ans);preorder(original->right,cloned->right,target,ans);}TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {//使用二叉树的遍历算法,使用前序遍历TreeNode*ans=NULL;preorder(original,cloned,target,ans);return ans;}
};
  • 正确代码
/*** 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*ans=NULL;void preorder(TreeNode*original,TreeNode*cloned,TreeNode*target){//前序遍历if(original==NULL&&cloned==NULL) return ;if(original==target) ans=cloned;preorder(original->left,cloned->left,target);preorder(original->right,cloned->right,target);}TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {//使用二叉树的遍历算法,使用前序遍历preorder(original,cloned,target);return ans;}
};
  • 对比一下两个代码就可以看出,第一次我使用ans 是作为局部变量来使用的,而函数的返回值是TreeNode*和返回引用是一样的,这种情况不能用局部变量返回,因为局部变量在作用域结束后就被系统释放了,此时返回的引用本身就是ans本体,而局部的ans被释放了,返回的也就同样失效了。

  • 所以第二次我就将ans作为成员函数,他的生命周期就不会那么局限了。

专题14:回溯算法

题目3033:修改矩阵(YES)

  • 解题思路:for循环遍历每个列然后记录比较就行

给你一个下标从 0 开始、大小为 m x n 的整数矩阵 matrix ,新建一个下标从 0 开始、名为 answer 的矩阵。使 answer 与 matrix 相等,接着将其中每个值为 -1 的元素替换为所在列的 最大 元素。

返回矩阵 answer 。

class Solution {
public:vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {//这题就遍历每一个列,然后记录最大值,当找到-1时,就将最大数赋值给-1//遍历每一列for(int i=0;i<matrix[0].size();i++){int max_count=-2;vector<int>row;//记录是-1的行坐标vector<int>col;//记录是-1的列坐标for(int j=0;j<matrix.size();j++){if(max_count<matrix[j][i]){max_count=matrix[j][i];}if(matrix[j][i]==-1){//记录坐标row.push_back(j);col.push_back(i);}}//一列遍历结束,对-1进行处理for(int k=0;k<row.size();k++){matrix[row[k]][col[k]]=max_count;}}return matrix;}
};

题目401:二进制手表(NO)

  • 解题思路:使用两层for遍历所有的时间,看1的个数是否符合,这里主要用到了__builtin_popcount()统计一个整数中二进制1的个数。

二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。

例如,下面的二进制手表读取 “4:51” 。

给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。

小时不会以零开头:

例如,“01:00” 是无效的时间,正确的写法应该是 “1:00” 。
分钟必须由两位数组成,可能会以零开头:

例如,“10:2” 是无效的时间,正确的写法应该是 “10:02” 。

  • 官方题解
class Solution {
public:vector<string> readBinaryWatch(int turnedOn) {vector<string> ans;for (int h = 0; h < 12; ++h) {for (int m = 0; m < 60; ++m) {if (__builtin_popcount(h) + __builtin_popcount(m) == turnedOn) {ans.push_back(to_string(h) + ":" + (m < 10 ? "0" : "") + to_string(m));}}}return ans;}
};
  • __builtin_popcount并不是所有的编译器都这么写,vs2022用的就是__popcnt,这个是内置函数,不同的编译器可能会有差异。

题目257:二叉树的所有路径(NO)

  • 解题思路:广度优先搜索

给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径。

叶子节点 是指没有子节点的节点。

  • 官方题解
/*** 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> binaryTreePaths(TreeNode* root) {vector<string> paths;if (root == nullptr) {return paths;}queue<TreeNode*> node_queue;queue<string> path_queue;node_queue.push(root);path_queue.push(to_string(root->val));while (!node_queue.empty()) {TreeNode* node = node_queue.front(); string path = path_queue.front();node_queue.pop();path_queue.pop();if (node->left == nullptr && node->right == nullptr) {paths.push_back(path);} else {if (node->left != nullptr) {node_queue.push(node->left);path_queue.push(path + "->" + to_string(node->left->val));}if (node->right != nullptr) {node_queue.push(node->right);path_queue.push(path + "->" + to_string(node->right->val));}}}return paths;}
};

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

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

相关文章

MSPM0G3507——读取引脚的高低电平方法(数字信号循迹模块)

SYSCFG配置 代码部分 //第一个传感器if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT_PIN1_PIN )xunji_PORT_PIN1_PIN) //黑&#xff0c;不亮 高{a1;}if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT…

每周算法(week2)【leetcode11~30】

前言 本该两周完成的30道算法题没想到5天就完成了&#xff0c;接下来继续刷算法&#xff0c;保持手感&#xff0c;对不熟悉的基础算法二分、搜索还得继续练。 leetcode 编号完成时间复习时间11. 盛水最多的容器2024-07-0212. 整数转罗马数字2024-07-0213. 罗马数字转整数2024-…

计算机大方向的选择

选专业要了解自己的兴趣所在。 即想要学习什么样的专业&#xff0c;如果有明确的专业意向&#xff0c;就可以有针对性地选择那些专业实力较强的院校。 2.如果没有明确的专业意向&#xff0c;可以优先考虑一下院校。 确定一下自己想要选择综合性院校还是理工类院校或是像财经或者…

从 Keycloak 导出和导入 Realm 和用户

1. 首先对keycloak 命令有所了解 需要将 Keycloak 中的 Realm 导出或导入时&#xff0c;您可以使用 JSON 文件进行操作。以下是一些有关导出和导入 Realm 的方法&#xff1a; 导出 Realm 到目录&#xff1a; 使用 export 命令将 Realm 导出到目录。在执行此命令时&#xff0c;…

技术分享:直播平台如何开发并接入美颜SDK

本篇文章&#xff0c;笔者将分享直播平台如何开发并接入美颜SDK的技术细节与步骤。 一、选择合适的美颜SDK 首先&#xff0c;选择一款适合的美颜SDK非常重要。市面上有很多优秀的美颜SDK供应商&#xff0c;选择时应考虑以下因素&#xff1a; 功能丰富性&#xff1a;支持美白…

短视频文案提取神器怎么提取抖音视频文案!

很多编导以及视频内容创作者为了提高自己的工作效率还会使用视频转文字提取神器&#xff0c;我们都清楚短视频领域每个平台人群熟悉都有所不同&#xff0c;在分发内容的时候也会调整内容已符合平台属性。 短视频文案提取神器怎么提取抖音视频文案 短视频常见的平台有抖音、西瓜…

linux ifconfig未找到命令

linux ifconfig未找到命令 1、使用yum安装net-tools yum install net-toolsyum报未找到命令请查看文章vim未找到命令&#xff0c;且yum install vim安装vim失败 2、安装后使用ifconfig命令 ifconfig

windows实现Grafana+Loki+loki4j轻量级日志系统,告别沉重的ELK

文章目录 Loki下载Loki下载安装Loki添加Loki数据源springboot日志推送 Loki下载 下载地址&#xff1a;https://github.com/grafana/loki/releases/ 找到loki-windows-amd64.exe.zip点击开始下载&#xff0c;我这里下载的2.9.9版本 Loki下载 下载地址&#xff1a;https://gr…

springboot苏桦旅游管理系统-计算机毕业设计源码02123

摘要 旅游业在全球范围内不断发展&#xff0c;为了提供高效的旅游管理和服务&#xff0c;开发一个旅游管理系统具有重要意义。本文旨在设计和实现该旅游管理系统&#xff0c;以满足用户和管理员的需求。该系统采用Spring Boot作为后端框架&#xff0c;利用其简化的开发流程和强…

暑假即将上映的电影——浔川电影报

作为全年最长的电影档期&#xff0c;暑期档目前已经启动。根据统计&#xff0c;定档暑期档的电影已超过100部&#xff0c;而观众的观影热情正在逐步升温。据灯塔专业版数据显示&#xff0c;截至7月4日14时50分&#xff0c;2024年暑期档期&#xff08;6月1日-8月31日&#xff09…

通过百度文心智能体创建STM32编程助手-实操

一、前言 文心智能体平台AgentBuilder 是百度推出的基于文心大模型的智能体&#xff08;Agent&#xff09;平台&#xff0c;支持广大开发者根据自身行业领域、应用场景&#xff0c;选取不同类型的开发方式&#xff0c;打造大模型时代的产品能力。开发者可以通过 prompt 编排的…

【并发编程JUC】AQS详解

定义理解 AQS&#xff0c;全称为AbstractQueuedSynchronizer&#xff0c;是Java并发包&#xff08;java.util.concurrent&#xff09;中的一个框架级别的工具类&#xff0c;用于构建锁和同步器。它是许多同步类的基础&#xff0c;如ReentrantLock、Semaphore、CountDownLatch等…

相关技术 太阳能热水器循环水泵制作技术

网盘 https://pan.baidu.com/s/1oAKwUEGkKnEgxE-F4znKow?pwdidxd 双温区蓄能供热型太阳能热水系统及其工作方法.pdf 双罐叠压节能恒温型太阳能热水机组.pdf 基于傅科电流的循环式风能热水器.pdf 基于太阳能利用的建筑冷热电联产系统及工作方法.pdf 基于太阳能和热泵的双蓄式热…

C++ function bind 学习笔记

文档声明&#xff1a; 以下资料均属于本人在学习过程中产出的学习笔记&#xff0c;如果错误或者遗漏之处&#xff0c;请多多指正。并且该文档在后期会随着学习的深入不断补充完善。感谢各位的参考查看。 笔记资料仅供学习交流使用&#xff0c;转载请标明出处&#xff0c;谢谢配…

使用Selenium进行Web应用自动化测试

自动化测试是现代软件开发中不可或缺的一部分&#xff0c;它可以帮助我们快速、准确地验证软件的功能。Selenium是一个广泛使用的自动化测试工具&#xff0c;特别适用于Web应用程序。本文将详细介绍如何使用Selenium进行Web应用自动化测试&#xff0c;并提供丰富的Java代码示例…

C++:特殊类的设计(无线程)

目录 一、设计一个不能拷贝类 二、设计一个只能在堆上创建对象的类 方法一&#xff1a;析构函数私有化 方法二&#xff1a;构造函数私有化 三、设计一个只能在栈上创建对象的类 四、设计一个类不能被继承 五、设计一个只能创建一个对象的类&#xff08;单例模式&#xf…

海思SS928(SD3403)内存地址空间分配和使用

说明 所有 DDR 内存中&#xff0c;一部分由操作系统管理&#xff0c;称为 OS 内存&#xff1b;另一部分由 MMZ 模块管理&#xff0c;供媒体业务单独使用&#xff0c;称为 MMZ 内存。具体描述参考《SS928V100 SDK 安装以及升级使用说明.pdf》的“第5部分 地址空间分配与使用”。…

数学建模MATLAB绘图大全

最近快要开始一年一度的数学建模竞赛啦&#xff0c;接下来争取每天更一篇数学建模算法&#xff01;&#xff08;当然这是理想状态下&#xff09;&#xff0c;今天就先更一些MATLAB常用的绘图吧&#xff0c;论文赏心悦目的关键就在于丰富多彩的图&#xff0c;好看的图一定会成为…

景区智慧公厕,剩余厕位显示,公厕环境监测。

在当今科技飞速发展的时代&#xff0c;景区的服务设施也在不断升级和创新。其中&#xff0c;景区智慧公厕的出现无疑为游客带来了极大的便利。特别是剩余厕位显示和公厕环境监测这两大功能&#xff0c;更是显著提升了景区公厕的管理水平和游客的使用体验。 剩余厕位显示功能是景…

磁钢生产领域上下料解决方案

随着智能制造技术的不断革新&#xff0c;磁钢生产领域正逐步引入自动化生产线。然而&#xff0c;传统的人工上下料方式存在诸多问题&#xff0c;难以满足现代生产需求。富唯智能提出了一款复合机器人磁钢上下料解决方案&#xff0c;通过先进的自动化技术&#xff0c;提高生产效…