2.1 LeetCode总结(基本算法)_DFS

1.4 练习

104. 二叉树的最大深度

int maxDepth(struct TreeNode *root, int len) 
{if (root == NULL) {return len;}return fmax(maxDepth(root->left, len+1), maxDepth(root->right, len+1));
}

二叉树最大深度就是基本的递归思路的求解, 手法主要是递归下去之后len改如何赋值有点搞不清,这里给出了demo的用例,只要能递归就加+1,最后递归到叶子节点返回len。
手法:利用 “递”

111. 二叉树的最小深度

在这里插入图片描述
手法:利用 “归” ,这里不同于二叉树的深度求解,深度是利用递的性质,本题是先递下去,再归时做了处理。(具体见下面代码注释部分)

int minDepth(struct TreeNode *root) {if (root == NULL) {return 0;}if (root->left == NULL && root->right == NULL) {return 1;}int min_depth = INT_MAX; // 手法2:归上来时,要保证每次函数返回值与min_depth的fmin操作时//  函数返回值都能保留下来,所以min_depth要设置最大值.if (root->left != NULL) {min_depth = fmin(minDepth(root->left), min_depth);}if (root->right != NULL) {min_depth = fmin(minDepth(root->right), min_depth);}return min_depth + 1; // 手法1:利用归的特性,先递下去求解到叶子节点的数值,进入到循环终止条件// 然后每层,逐层归上来时+1.
}

049. 求从根节点到叶节点的路径数字之和

在这里插入图片描述

int dfs(struct TreeNode *root, int prevSum) {if (root == NULL) {return 0;}int sum = prevSum * 10 + root->val;if (root->left == NULL && root->right == NULL) {return sum; // 递归终止条件} else {return dfs(root->left, sum) + dfs(root->right, sum);// 先递归下去左叶子节点,计算出来,然后递归右叶子节点}
}int sumNumbers(struct TreeNode *root) {return dfs(root, 0);
}

93. 复原 IP 地址

在这里插入图片描述

#define MAX 166     // 排列组合简单算的,实际没有这么多,很多情况不合法
void dfs(char *s, char **res, int *returnSize, int step, int index, int len, char *temp) 
{if (step == 4) {    // 结束条件:已取完四个数,将结果添加至结果数组res[*returnSize] = (char*)malloc(sizeof(char)*(len + 4));temp[index + step - 1] = '\0';      //将最后一个'.'去掉strcpy(res[*returnSize], temp);(*returnSize)++;return;}// 取一位数;// 剪枝:剩余长度不合法的情况// 剩余长度属于 [(3 - step), (3 - step) * 3]if ((len - index - 1 <= (3 - step) * 3) && (len - index - 1 >= (3 - step))) {temp[index + step]     = s[index];temp[index + step + 1] = '.';dfs(s, res, returnSize, step + 1, index + 1, len, temp);}// 取两位合法数(首位不为0); s[index] != '0'// 剪枝:剩余长度不合法的情况if ((len - index - 2 <= (3 - step) * 3) && ((len - index - 2 >= (3 - step)) && (s[index] != '0'))) {temp[index + step]     = s[index];temp[index + step + 1] = s[index + 1];temp[index + step + 2] = '.';dfs(s, res, returnSize, step + 1, index + 2, len, temp);}// 取三位合法数(首位不为0,且<=255);// 剪枝:剩余长度不合法的情况if ((len - index - 3 <= (3 - step) * 3) && (len - index - 3 >= (3 - step)) && ((s[index] != '0') && ((s[index] - '0') * 100 + (s[index + 1] - '0') * 10 + s[index + 2] - '0' <= 255))) {temp[index + step]     = s[index];temp[index + step + 1] = s[index + 1];temp[index + step + 2] = s[index + 2];temp[index + step + 3] = '.';dfs(s, res, returnSize, step + 1, index + 3, len, temp);}
}char **restoreIpAddresses(char *s, int *returnSize) 
{*returnSize = 0;int len = strlen(s);if (len > 12 || len < 4) {return NULL;     //长度不合法直接return}char **res = (char **)malloc(sizeof(char *) * MAX);char *temp = (char *)malloc(sizeof(char) * (len + 5));dfs(s, res, returnSize, 0, 0, len, temp);return res;
}

130. 被围绕的区域

在这里插入图片描述
注意到题目解释中提到:任何边界上的 O 都不会被填充为 X。 我们可以想到,所有的不被包围的 O 都直接或间接与边界上的 O 相连。我们可以利用这个性质判断 O 是否在边界上,具体地说:

对于每一个边界上的 O,我们以它为起点,标记所有与它直接或间接相连的字母 O;
最后我们遍历这个矩阵,对于每一个字母:
如果该字母被标记过,则该字母为没有被字母 X 包围的字母 O,我们将其还原为字母 O;
如果该字母没有被标记过,则该字母为被字母 X 包围的字母 O,我们将其修改为字母 X

void dfs(char **board, int x, int y, int row, int col)
{if (x < 0 || x >= row || y < 0 || y >= col || board[x][y] != 'O') {  // 从边界的'O'出发遍历与之直接或间接相邻的'O'return;}board[x][y] = 'Z';  // 暂时将与边界上的'O'直接或间接相邻的'O'标记为'Z'dfs(board, x + 1, y, row, col);  // 向下遍历dfs(board, x - 1, y, row, col);  // 向上遍历dfs(board, x, y + 1, row, col);  // 向右遍历dfs(board, x, y - 1, row, col);  // 向左遍历
}void solve(char **board, int boardSize, int *boardColSize)
{if (board == NULL || boardSize == 0 || (*boardColSize) == 0) {return;}int row = boardSize;int col = (*boardColSize);int i, j;for (i = 0; i < col; i++) {  // 寻找与第一行的'O'直接或间接相邻的'O'if (board[0][i] == 'O') {dfs(board, 0, i, row, col);}// 寻找与最后一行的'O'直接或间接相邻的'O'if (board[row - 1][i] == 'O') {dfs(board, row - 1, i, row, col);}}for (i = 0; i < row; i++) {  // 寻找与第一列的'O'直接或间接相邻的'O'if (board[i][0] == 'O') {dfs(board, i, 0, row, col);}// 寻找与最后一列的'O'直接或间接相邻的'O'if (board[i][col - 1] == 'O') {dfs(board, i, col - 1, row, col);}}// 结果for (i = 0; i < row; i++) {  // 将被'X'围绕的'O'转换为'X'for (j = 0; j < col; j++) {if (board[i][j] == 'O') {board[i][j] = 'X';}else if (board[i][j] == 'Z') { // 之前将不被'X'围绕的'O'转换为'Z',现在恢复为'O'board[i][j] = 'O';}}}
}

22. 括号生成

在这里插入图片描述

// 回溯法求解
#define MAX_SIZE 1430  // 卡特兰数: 1, 1, 2, 5, 14, 42, 132, 429, 1430
void generate(int left, int right, int n, char *str, int index, char **result, int *returnSize) 
{if (index == 2 * n) { // 当前长度已达2nresult[(*returnSize)] = (char *)malloc((2 * n + 1) * sizeof(char));memset(result[(*returnSize)], 0, (2 * n + 1) * sizeof(char));strcpy(result[(*returnSize)++], str);return;}// 如果左括号数量不大于 n,可以放一个左括号if (left < n) {str[index] = '(';generate(left + 1, right, n, str, index + 1, result, returnSize);}// 如果右括号数量小于左括号的数量,可以放一个右括号if (right < left) {str[index] = ')';generate(left, right + 1, n, str, index + 1, result, returnSize);}
}
/*** Note: The returned array must be malloced, assume caller calls free().*/
char **generateParenthesis(int n, int *returnSize)
{char *str = (char *)malloc((2 * n + 1) * sizeof(char));memset(str, 0 ,(2 * n + 1) * sizeof(char));char **result = (char **)malloc(sizeof(char *) * MAX_SIZE);*returnSize = 0;generate(0, 0, n, str, 0, result, returnSize);return result;
}

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

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

相关文章

C语言基础(三)

C语言基础 三大结构顺序结构选择结构单分支选择结构双分支选择结构多分支选择结构if ...else if....elseswitch语句 循坏结构for循环表达式1可以省略吗&#xff1f;表达式2可以省略吗&#xff1f;表达式3可以省略吗&#xff1f;for循坏的嵌套 while循环do while循坏while与do w…

android支付宝接入流程

接入前准备 接入APP支付能力前&#xff0c;开发者需要完成以下前置步骤。 本文档展示了如何从零开始&#xff0c;使用支付宝开放平台服务端 SDK 快速接入App支付产品&#xff0c;完成与支付宝对接的部分。 第一步&#xff1a;创建应用并获取APPID 要在您的应用中接入支付宝…

【新版】系统架构设计师 - 知识点 - 结构化开发方法

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 知识点 - 结构化开发方法结构化开发方法结构化分析结构化设计 数据流图和数据字典模块内聚类型与耦合类型 架构 - 知识点 - 结构化开发方法 结构化开发方法 分析阶段 工具&#xff1a;数据流图、…

前端学习<四>JavaScript基础——20-函数简介

函数的介绍 函数&#xff1a;就是一些功能或语句的封装。在需要的时候&#xff0c;通过调用的形式&#xff0c;执行这些语句。 补充&#xff1a; 函数也是一个对象 使用typeof检查一个函数对象时&#xff0c;会返回 function 函数的作用&#xff1a; 一次定义&#xff0c;…

腾讯云服务器搭建网站教程,新手跟着流程一步步操作

使用腾讯云服务器搭建网站全流程&#xff0c;包括轻量应用服务器和云服务器CVM建站教程&#xff0c;轻量可以使用应用镜像一键建站&#xff0c;云服务器CVM可以通过安装宝塔面板的方式来搭建网站&#xff0c;腾讯云服务器网txyfwq.com整理使用腾讯云服务器建站教程&#xff0c;…

《黑马点评》Redis高并发项目实战笔记(上)P1~P45

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp&#xff0c;然后右键hmdp下的表&#xff0c;选择运行SQL文件&#xff0c;然后指定运行文件hmdp.sql即可&#xff08;建议MySQL的版本在5.7及以上&#xff09;&#xff1a; 下面这…

Ubuntu20.04安装ROS过程记录以及常见报错处理

官网安装步骤如下&#xff1a; http://wiki.ros.org/cn/noetic/Installation/Ubuntu#A.2BXwBZy1uJiMU- 第一个&#xff1a;添加ROS软件源 sudo sh -c echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-la…

2024年mathorcup数学建模C题思路分析-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

Quantum Temple借助Sui通过NFT推动再生旅游

从金融到艺术&#xff0c;从游戏到无线网络&#xff0c;各行各业都涌现出大量初创公司&#xff0c;利用区块链技术颠覆现状。说到旅游业&#xff0c;让人联想到拥挤的机场、快节奏的旅游和豪华游轮&#xff0c;可能看起来对区块链创新持守旧态度。一家初创公司认为现在是时候改…

【神经网络与深度学习】循环神经网络基础

tokenization tokenization&#xff1a;分词 每一个词语都是token 分词方法&#xff1a;转为单个词、转为多个词语 N-gram表示法 准备词语特征的方法 &#xff08;把连续的N个词作为特征&#xff09; 如 ”我爱你“——>[我&#xff0c;爱&#xff0c;你] 2-gram——[[我…

MySQL 嵌套查询

嵌套查询 是指在一个完整的查询语句之中&#xff0c;包含若干个不同功能的小查询&#xff1b;从而一起完成复杂查询的一种编写形式。包含的查询放在&#xff08;&#xff09;里 &#xff0c; 包含的查询出现的位置&#xff1a; 位置含义SELECT之后把查询结果作为表头使用FROM…

Redis中的集群(九)

集群 消息 集群中的各个节点通过发送和接收消息(message)来进行通信&#xff0c;我们称发送消息的节点为发送者(sender),接收消息 的节点成为接收者&#xff0c;如图所示。节点发送的消息主要有以下五种: 1.MEET消息:当发送者接到客户端发送的CLUSTER MEET命令时&#xff0c…

LabVIEW电信号傅里叶分解合成实验

LabVIEW电信号傅里叶分解合成实验 电信号的分析与处理在科研和工业领域中起着越来越重要的作用。系统以LabVIEW软件为基础&#xff0c;开发了一个集电信号的傅里叶分解、合成、频率响应及频谱分析功能于一体的虚拟仿真实验系统。系统不仅能够模拟实际电路实验箱的全部功能&…

ExpressLRS硬件实测性能分析

ExpressLRS硬件实测性能分析 1. 源由2. 远航测试3. 实验室测试3.1 芯片RSSI与实测功率差异3.2 SNR信噪比稳定3.3 140db衰减器衰减&#xff0c;40个频点信号稳定 4. 外场测试4.1 无屏蔽样品4.2 有屏蔽样品4.3 有屏蔽vs无屏蔽样品 5. 估算6. 总结7. 补充说明 -- 50mW视频 1. 源由…

降额的秘密——不要挑战datasheet!

原文来自微信公众号&#xff1a;工程师看海&#xff0c;与我联系&#xff1a;chunhou0820 看海原创视频教程&#xff1a;《运放秘籍》 大家好&#xff0c;我是工程师看海。 什么是降额设计&#xff1f;我们为什么要降额&#xff1f; 额指的是额定工作状态&#xff0c;降额就是…

【蓝桥杯】第十五届填空题a.握手问题

题解&#xff1a; 根据问题描述&#xff0c;总共有 50 人参加会议&#xff0c;每个人除了与自己以外的其他所有人握手一次。但有 7 个人彼此之间没有进行握手&#xff0c;而与其他所有人都进行了握手。 首先&#xff0c;计算所有人进行握手的总次数&#xff1a; 总人数为 50 …

Day19-【Java SE进阶】网络编程

一、网络编程 1.概述 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信的)。java.net,*包下提供了网络编程的解决方案! 基本的通信架构 基本的通信架构有2种形式:CS架构(Client客户端/Server服务端)、BS架构(Browser浏览器/Server服务端)。 网络通信的…

拓展企业发展新天地:低代码开发平台的策略价值

一、什么是低代码开发&#xff1f; 低代码开发平台&#xff1a;一个号称在几分钟内就能构建出一套企业内部适用的系统开发工具。低代码开发平台可以从降低开发者技术门槛、减少企业人力成本、协同共享资源、灵活搭建组件、减少bug率、按需收费等多个方面降低企业开发成本。 曾…

排序1——C语言

排序 1. 复杂度2. 插入排序2.1 直接插入排序2.2 希尔排序 3. 选择排序3.1 直接选择排序3.2 堆排序 排序在生活中很常见&#xff0c;比如在网购时&#xff0c;按价格排序&#xff0c;按好评数排序&#xff0c;点餐时&#xff0c;按评分排序等等。而排序有快和慢&#xff0c;快的…

Navicat Premium 16 for Mac/Win:数据库管理的全能之选

在数字化时代&#xff0c;数据库管理已成为各行各业不可或缺的一环。而Navicat Premium 16作为一款功能强大的数据库管理软件&#xff0c;无疑为数据库管理员和开发者提供了高效、便捷的解决方案。 Navicat Premium 16支持多种主流数据库系统&#xff0c;无论是MySQL、Postgre…