【C++ 算法进阶】算法提升五

先序遍历改二叉搜索树 (二叉树的递归套路)

题目

本题为LC原题目 题目如下

在这里插入图片描述

题目分析

本题为一道经典的二叉树递归套路题目

我们只需要想好一个递归函数 之后让左右节点分别执行即可

我们这里想到的递归函数为

 TreeNode* process(vector<int>& preorder , int L , int R)

该递归函数的意义为 给你数组的左右边界返回构造好的bst的头结点

之后我们只需要想边界条件

构造当前节点 构造左右子树即可

代码详解

class Solution {
public:// 该递归函数的意义为 给你数组的左右边界返回构造好的bst的头结点TreeNode* process(vector<int>& preorder , int L , int R) {if (L > R) {return nullptr;}TreeNode* root = new TreeNode(preorder[L]);// 找到左右边界的L和Rint i = 0;for ( i = L + 1 ; i < preorder.size(); i++) {if (preorder[i] > preorder[L]) {break;}}int nextright = i;// 1. 没有左边界  2.没有右边界root->left = process(preorder , L + 1 , nextright - 1);root->right = process(preorder , nextright , R);return root;}TreeNode* bstFromPreorder(vector<int>& preorder) {return process(preorder , 0 , preorder.size() - 1);}
};

返回一颗二叉树上有多少相等的子树 (二叉树的递归套路)

题目

给定一颗二叉树要求返回其最大相等子树的个数

题目分析

基本上所有的二叉树套路都可以使用我们题目一的解法来解决

我们首先假设一个函数

 int process(TreeNode* root)

这个函数表示 我们给它一个根节点 它会返回我们二叉树上有多少相等的子树

之后只需要考虑边界条件 想左右子树即可

代码如下

代码详解

 int process(TreeNode* root) {// 如果节点为空,返回 0if (root == nullptr) {return 0;}// 如果是叶子节点,本身就是一个子树,返回 1if (root->left == nullptr && root->right == nullptr) {return 1;}// 递归检查左右子树int lnLeftEqualSubtrees = process(root->left);int lnRightEqualSubtrees = process(root->right);// 如果左子树和右子树都存在且它们相等(值和结构相同)if (root->left != nullptr && root->right != nullptr && isSameTree(root->left, root->right)) {return 1 + lnLeftEqualSubtrees + lnRightEqualSubtrees;}// 否则只加上左右子树的相等子树数量return lnLeftEqualSubtrees + lnRightEqualSubtrees;}// 辅助函数:判断两棵树是否相同bool isSameTree(TreeNode* p, TreeNode* q) {if (p == nullptr && q == nullptr) {return true;}if (p == nullptr || q == nullptr || p->val != q->val) {return false;}return isSameTree(p->left, q->left) && isSameTree(p->right, q->right);}

编辑距离问题 (动态规划 样本对应模型)

题目

本题为LC原题 题目如下

在这里插入图片描述

题目分析

本题为经典的动态规划 样本对应模型 对于此模型 我们一般画出一张二维表即可解决

在这里插入图片描述

此二维表的含义为 dp[i][j] 表示word1的前i个字符可以变成word2的前j个字符能变化的最小次数

当i = 0的时候只有可能增加字符 所以第一行一定为 1 2 3 … M
当j= 0的时候只有可能删除字符 所以第一列一定是 1 2 3 4 … N

此时我们就可以推普遍情况了

既然可以增 删 换 那么我们的达成的方法就有三种

  1. 假设我们现在知道dp[i][j-1] 那么要得到dp[i][j] 只需要增加一个字符串
  2. 同理dp[i-1][j] 就只需要减少一个字符串
  3. dp[i-1][j-1]的情况比较特殊 此时我们要考虑他们i-1 j-1位置上的字符是否相等

最后取这三种可能性的最小值即可

代码详解

class Solution {
public:int minDistance(string word1, string word2) {int M = word1.size();int N = word2.size();int ans = 0;vector<vector<int>>  dp(M + 1, vector<int>(N + 1, 0));for (int i = 0 ; i <= M ; i++) {dp[i][0] = i;}for (int j = 0; j <= N ; j++) {dp[0][j] = j;}for (int i = 1 ; i <= M ; i++) {for (int j = 1 ; j <=N ; j++) {int p1 = min(dp[i][j-1] , dp[i-1][j]) + 1;int p2 = word1[i-1] == word2[j-1] ? dp[i-1][j-1] : dp[i-1][j-1] + 1;dp[i][j] = min(p1 , p2);}}ans = dp[M][N];return ans;}};

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

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

相关文章

asp.net core mvc发布时输出视图文件Views

var builder WebApplication.CreateBuilder(args); builder.Services.AddRazorPages();builder.Services.AddControllersWithViews(ops > {//全局异常过滤器&#xff0c;注册ops.Filters.Add<ExceptionFilter>(); })// Views视图文件输出到发布目录&#xff0c;视图文…

【yolov8旋转框检测】微调yolov8-obb目标检测模型:数据集制作和训练

一、开发环境的准备 1.1 安装roLabelImg 参考【目标检测—旋转框标注】roLabelImg安装与使用文章的介绍&#xff0c;完成roLabelImg的安装。 1.2 Yolov8开发环境的准备 首先创建python虚拟环境&#xff0c;pip install ultralytics 来进行安装。 二、数据集准备 流程&…

FairGuard游戏加固全面适配纯血鸿蒙NEXT

2024年10月8日&#xff0c;华为正式宣布其原生鸿蒙操作系统 HarmonyOS NEXT 进入公测阶段&#xff0c;标志着其自有生态构建的重要里程碑。 作为游戏安全领域领先的第三方服务商&#xff0c;FairGuard游戏加固在早期就加入了鸿蒙生态的开发&#xff0c;基于多项独家技术与十余年…

数据库权限提升GetShell

数据库提权总结 - 随风kali - 博客园 (cnblogs.com) MySQL 漏洞利用与提权 | 国光 (sqlsec.com) sql注入getshell的几种方式 第99天&#xff1a;权限提升-数据库提权&口令获取&MYSQL&MSSQL&Oracle&MSF SQL注入拿shell的方式应该是通用的得到连接数据库…

未来AI的学习能力会达到怎样的水平?

​ 大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 AI工具集1&#xff1a;大厂AI工具【共2…

微软运用欺骗性策略大规模打击网络钓鱼活动

微软正在利用欺骗性策略来打击网络钓鱼行为者&#xff0c;方法是通过访问 Azure 生成外形逼真的蜜罐租户&#xff0c;引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据&#xff0c;微软可以绘制恶意基础设施地图&#xff0c;深入了解复杂的网络钓鱼操作&#xff…

Verilog基础:层次化标识符的使用

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 一、前言 Verilog HDL中的标识符(identifier)是一个为了引用而给一个Verilog对象起的名字&#xff0c;分为两大类&#xff1a;普通标识符大类和层次化标识符大类。…

监控易监测对象及指标之:Kafka中间件JMX监控指标解读

监控易作为一款功能强大的监控软件&#xff0c;旨在为企业提供全方位的IT系统监控服务。其中&#xff0c;针对Kafka中间件的JMX监控是监控易的重要功能之一。本文将详细解读监控易中Kafka的JMX监控指标&#xff0c;帮助企业更好地理解并运用这些数据进行系统性能调优和故障排查…

算法笔记day07

1.最长回文子串 最长回文子串_牛客题霸_牛客网 算法思路&#xff1a; 使用中心扩散算法&#xff0c;枚举所有的中点&#xff0c;向两边扩散&#xff0c;一个中点需要枚举两次&#xff0c;一次当回文串是奇数另一次回文串是偶数的情况。 class Solution { public:int getLong…

mysql--基本查询

目录 搞定mysql--CURD操作&#xff0c;细节比较多&#xff0c;不难&#xff0c;贵在多多练 1、Create--创建 &#xff08;1&#xff09;单行插入 / 全列插入 &#xff08;2&#xff09;插入否则替换 &#xff08;3&#xff09;替换 2、Retuieve--select 1&#xff09;全…

git rebase的常用场景: 交互式变基, 变基和本地分支基于远端分支的变基

文章目录 作用应用场景场景一&#xff1a;交互式变基(合并同一条线上的提交记录) —— git rebase -i HEAD~2场景二&#xff1a;变基(合并分支) —— git rebase [其他分支名称]场景三&#xff1a;本地分支与远端分支的变基 作用 使git的提交记录变得更加简洁 应用场景 场景…

Unity之如何使用Unity Cloud Build云构建

文章目录 前言什么是 UnityCloudBuild?如何使用Unity云构建Unity 团队中的人员不属于 Unity Team 的人员UnityCloudBuild2.0价格表如何使用Unity云构建配置CloudBuild前言 Unity Cloud Build作为Unity平台的一项强大工具,它允许开发团队通过云端自动构建项目,节省了繁琐的手…

基于Springboot在线视频网站的设计与实现

基于Springboot视频网站的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xff1a;https://do…

JSON 注入攻击 API

文章目录 JSON 注入攻击 API"注入所有东西"是"聪明的"发生了什么? 什么是 JSON 注入?为什么解析器是问题所在解析不一致 JSON 解析器互操作性中的安全问题处理重复密钥的方式不一致按键碰撞响应不一致JSON 序列化(反序列化)中的不一致 好的。JSON 解析器…

Java | Leetcode Java题解之第497题非重叠矩形中的随机点

题目&#xff1a; 题解&#xff1a; class Solution {Random rand;List<Integer> arr;int[][] rects;public Solution(int[][] rects) {rand new Random();arr new ArrayList<Integer>();arr.add(0);this.rects rects;for (int[] rect : rects) {int a rect[0…

PPT自动化:Python如何将PPT转换为图片(ppt2img源码)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT转换图片 📒📝 Windows环境下PPT转为图片(源码)📝 Linux环境下PPT转为图片(源码)📝 注意事项⚓️ 相关链接 ⚓️📖 介绍 📖 在日常工作中,我们常常需要将大量的幻灯片转换为图片,这样不仅方便分享,还能提…

【数据库系统概论】第3章 关系数据库标准语言SQL(一)数据定义(超详细)

教材&#xff1a; 数据库系统概论&#xff08;第6版&#xff09;王珊,杜小勇,陈红编著 目录 一、SQL概述 1.1 SQL 的产生与发展 1.2 SQL的特点 1.3 SQL的基本概念 二、数据定义 2.1 数据库的定义 2.2 数据表的定义 2.3 模式的定义 一、SQL概述 1974年IBM为关系DBMS设…

Docker 搭建mysql

拉取mysql镜像 docker pull mysql # 拉取镜像 [rooteason ~]# docker pull mysql Using default tag: latest latest: Pulling from library/mysql 72a69066d2fe: Pull complete 93619dbc5b36: Pull complete 99da31dd6142: Pull complete 626033c43d70: Pull complete 37d…

用HTML构建酷炫的文件上传下载界面

1. 基础HTML结构 首先&#xff0c;我们构建一个基本的HTML结构&#xff0c;包括一个表单用于文件上传&#xff0c;以及一个列表用于展示已上传文件&#xff1a; HTML <!DOCTYPE html> <html> <head><title>酷炫文件上传下载</title><link …

分布式ID生成策略

文章目录 分布式ID必要性1.UUID2.基于DB的自增主键方案3.数据库多主模式4.号段模式5.Redis6.Zookeeper7.ETCD8.雪花算法9.百度(Uidgenerator)10.美团(Leaf)11.滴滴(TinyID) 分布式ID必要性 业务量小于500W的时候单独一个mysql即可提供服务&#xff0c;再大点的时候就进行读写分…