回溯算法 - 二叉树中和为某一值的路径 字符串的排列

news/2024/5/2 12:08:05/文章来源:https://blog.csdn.net/xaiobit_hl/article/details/127146531

目录

1.二叉树中和为某一值的路径

1.1 题目描述

1.2 回溯算法的一般步骤

1.3 解题思路

1.4 代码实现

2. 字符串的排列

2.1 题目描述

2.2 解题思路

2.3 代码实现


1.二叉树中和为某一值的路径

1.1 题目描述

输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为
expectNumber的所有路径。
1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点
2.叶子节点是指没有子节点的节点
3.路径只能从父节点到子节点,不能从子节点到父节点
4.总节点数目为n

 

1.2 回溯算法的一般步骤

1. 先添加值 (待选结果)

2. 再判定现有结果是否满足条件 (基于二叉树, 多叉树的穷举的过程, 在穷举的过程中, 要进行剪枝)

3. DFS (深度优先)

4. 回溯 (检测下一个)

1.3 解题思路

1.我们要明确从哪个节点开始.

2.深度优先遍历二叉树.

  • 遍历的过程中我们需要一个一维数组 (ArrayList<Integer>)来添加某条路径上的所有结点的值 (待选结果), 每添加一个值, 我们对应的 expectNumber 就对应减去该结点的值
  • 当该结点的左右子树都为空, 并且 expectNumber == 0 的时候, 此时我们需要一个二维数组 (ArrayList<ArrayList<Integer>>) 将其添加进去

1.4 代码实现

    public void FindPathDFS(TreeNode root, int expectNumber, ArrayList<ArrayList<Integer>> result, ArrayList<Integer> list) {if(root == null) {return;}// 添加结果到待选结果中list.add(root.val);expectNumber -= root.val;// 条件判断, 剪枝 (合法判定)if(root.left == null && root.right == null && expectNumber == 0) {result.add(new ArrayList<Integer>(list));}// DFSFindPathDFS(root.left, expectNumber, result, list);FindPathDFS(root.right, expectNumber, result, list);// 回溯list.remove(list.size() - 1);}public ArrayList<ArrayList<Integer>> FindPath(TreeNode root,int expectNumber) {ArrayList<ArrayList<Integer>> result = new ArrayList<>();if(root == null) {return result;}ArrayList<Integer> list = new ArrayList<>();FindPathDFS(root, expectNumber, result, list);return result;}

2. 字符串的排列

2.1 题目描述

输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。
例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。

 示例1

输入:"ab"
返回值:["ab","ba"]
说明:返回["ba","ab"]也是正确的 

2.2 解题思路

上图中基于三叉树的一个穷举过程, 然后再剪枝, 就得到了符合要求的排列组合.

于是这道题的全排列问题, 就可以看做如下三叉树型状态:

基本思路:

  1. 分别以 a, b, c 作为排列组合的起始字符, 然后 bc, ac, ab 再分别排列组合 (循环 + 递归)
  2. 这三次循环, 每排列组合完其中一种情况, 就需要进行回溯, 然后继续下一次排列组合.
  3. 注意每次准备将待选结果添加进结果集之前, 需要做去重处理, 以免出现类似于 "aa" 排列组合两次的情况.

2.3 代码实现

    public void swap(char[] str, int start, int i) {char tmp = str[start];str[start] = str[i];str[i] = tmp;}public boolean isExist(ArrayList<String> result, char[] str) {return result.contains(String.valueOf(str));}public void PermutationHelper(char[] str, int start, ArrayList<String> result) {if (start == str.length - 1) {// 去重if (!isExist(result, str)) {result.add(new String(str));}return;}for (int i = start; i < str.length; i++) {swap(str, start, i); // 以 i 对应的字符作为开始PermutationHelper(str, start + 1, result); // [i+ 1, str.length- 1] 排列组合swap(str, start, i); // 回溯}}public ArrayList<String> Permutation(String str) {ArrayList<String> list =  new ArrayList<>();if (str == null) {return list;}char[] ch = str.toCharArray();PermutationHelper(ch, 0, list);return list;}

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

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

相关文章

华为模拟器ensp学习笔记

CSDN话题挑战赛第2期 参赛话题&#xff1a;学习笔记 目录前言1️⃣如何注册eNSP设备?2️⃣如何通过SecureCRT登录eNSP模拟设备&#xff1f;结语前言 记录华为模拟器使用中遇到的问题 1️⃣如何注册eNSP设备? 如何注册eNSP设备 重新注册AR、WLAN设备&#xff1a; 启动AR时&…

模块化:CommonJS规范

目录 CommonJS规范 模块使用环境区分 核心语法 如何使用 CommonJS&#xff1a;服务器端使用 CommonJS&#xff1a;浏览器端使用 CommonJS规范 模块使用环境区分 CommonJS规范中&#xff0c;每一个JS文件都可以作为一个模块。模块的引入&#xff0c;主要区分两个环境&…

基于Java后台(Springboot框架)+前端小程序(MINA框架)+Mysql数据库的医院预约挂号小程序系统设计与实现

项目背景和意义 目的&#xff1a;本课题主要目标是设计并能够实现一个基于微信小程序医院预约挂号系统&#xff0c;前台用户使用小程序&#xff0c;后台管理使用基JavaMySql技术&#xff1b;通过后台设置医院信息、录入医院科室信息、录入医生信息、设置医生排班信息、查看预约…

(附源码)计算机毕业设计SSM毕业设计管理系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3功能需求分析 本系统采用从上往下的步骤开发&#xff0c;基本功能如下&#xff1a; 本课题要求实现一套毕业设计管理系统&#xff0c;系统主要包括&#xff08;管理员&#xff0c;教师和学生&a…

python-pyecharts基础知识

资料来源&#xff1a;2022新版黑马程序员python教程&#xff0c;8天python从入门到精通&#xff0c;学python看这套就够了_哔哩哔哩_bilibili 折线图 地图 动态GDP增长图 补充知识&#xff1a; json 1&#xff09;JSON是一种轻量级的数据交互格式。可以按照JSON指定的格式去…

群晖Docker套件注册Harbor私有镜像仓库,并下载运行自己发布的Docker镜像

[群晖Docker套件注册Harbor私有镜像仓库&#xff0c;并下载运行自己发布的Docker镜像] 在进行微服务开发时&#xff0c;一些基础服务组件&#xff08;Nacos、Redis、Mysql&#xff09;的运行以及越来越多的业务服务组件的开发&#xff0c;会导致开发者电脑的内存资源紧张&#…

Android:玩转Jetpack Compose之MVI架构——基类中使用页面UiState

系列文章目录 架构一&#xff08;MVP&#xff09;&#xff1a;Android:玩转RetrofitOkHttpKotlin协程 网络请求架构 架构二&#xff08;MVVM&#xff09;&#xff1a;Android:玩转网络请求架构 RetrofitKotlin协程简单使用(MVVM架构模式) 架构三&#xff08;MVI&#xff09;&a…

吴恩达machine-learning-specialization2022第1周的optional lab

1. 使用python和numpy实现一个线性回归 要求使用梯度下降法&#xff0c;可视化losslossloss随着迭代次数的变化曲线 2. 说明 2.1 拟合函数 fw,b(x(i))wx(i)bf_{w,b}(x^{(i)})wx^{(i)}bfw,b​(x(i))wx(i)b 2.2 均方误差损失函数 J(w,b)12m∑i0m−1(fw,b(x(i))−y(i))2J(w,b)…

【云原生丨Kubernetes系列15】创建 ConfigMap 资源对象

前言 前⾯我们深入学习了 Servie 的使⽤&#xff0c; Service 是 Kubernetes 系统中⾮常重要的⼀个核⼼概念&#xff0c;这节课我们来学习另外⼀个⾮常重要的资源对象&#xff1a; ConfigMap 文章目录前言引入创建引入 应用部署的一个最佳实践是将应用所需的配置信息与程序进行…

【ML13】overfitting and underfitting 过拟合与欠拟合

过拟合与欠拟合过拟合与欠拟合概念过拟合解决办法解决办法一&#xff1a;在训练集中加入更多数据解决办法二&#xff1a;优化数据集 feature selection解决方法三&#xff1a;正则化 Regularization正则化线性回归Recape of Cost Function of Linear RegressionAdd the regular…

算法刷题:可交换的连续最大和

目录前言1. 题目描述2. 题目分析3. 代码实现4. 运行测试后记前言 好久没有做题了&#xff0c;前两天做了一道题&#xff0c;感觉还比较有意思&#xff0c;来分享一下。想学习&#xff0c;但是自己实在是懒&#xff0c;懒癌怎么治&#xff1f;期待着自己彻底奋发图强那一天。 …

【Ubuntu】常用软件下载与安装汇总

前言 发现很多诸如Detectron2的开源项目官方仅提供Liunx系统的安装方式&#xff0c;于是愤而将工作机系统换成了Ubuntu20.04&#xff0c;下面记录一些常用软件的安装方式&#xff0c;以便再次换机时能快速迁移&#xff0c;后续装新的软件会持续更新。 安装yum 直接安装会报错…

潜伏在ISP网络中数月的新黑客组织“Metador”

研究人员称之为“Metador”的一个以前未知的威胁因素已经入侵电信、互联网服务提供商(ISP)和大学大约两年了。 Metador的目标是中东和非洲的组织&#xff0c;他们的目的似乎是长期坚持间谍活动。该组织使用了两种基于Windows的恶意软件&#xff0c;它们被描述为“极其复杂”&a…

JavaScript:BOM

目录 一、BOM介绍 1、BOM的构成 二、window对象常用方法 1、窗口加载事件 2、window.onresize 3、confirm()方法 4、open()方法 5、setTimeout()定时器 6、this的使用 7、JS是单线程 8、JS执行机制 9、URL 10、location对象的属性 11、document对象 12、Date对象…

(附源码)计算机毕业设计ssm办公自动化系统

毕设帮助&#xff0c;指导&#xff0c;本源码分享&#xff0c;调试部署(见文末) 3.3系统流程和逻辑 系统业务流程图&#xff0c;如图所示&#xff1a; 图3-1登录流程图 图3-2添加信息流程图 图3-3注册信息流程图 4.1 概述 办公自动化系统基于Web服务模式&#xff0c;是一个适…

实训十七:交换机单端口环路检测配置

一、实验目的 1、了解单端口环路检测的作用 2、熟悉单端口环路检测的配置 二、 应用环境 1、针对网络中存在用户自行架设的 HUB 设备可能导致的环路&#xff0c;在交换机设备上运行单端 口环路检测以防止由于 HUB 连线失误导致的网络环路。 三、 实验设备 1、 DCN-CS6200 …

【CH559L单片机】串口下载程序说明

【CH559L单片机】串口下载程序说明&#x1f4cc;关篇《【硬件开源电路】CH559L开发板和CH55x_DAP-Link二合一开发板分享》 &#x1f4e2;CH559L单片机想通过串口来实现程序的烧录&#xff0c;折腾了我2天了&#xff0c;一直是失败&#xff0c;没有成功过一次&#xff0c;昨天跑…

【CSS3】 平面转换 空间转换 动画

目录平面转换平移缩放倾斜旋转transform复合属性空间转换空间位移空间旋转呈现立体图形空间缩放动画动画属性steps逐帧动画多组动画平面转换 CSS3中动画效果包括3个部分&#xff1a;过渡&#xff08;transition&#xff09;、变形&#xff08;transform&#xff09;、动画&…

如何使用 SAP UI5 V2 ODataModel 模型 API 实现 deepCreate 的场景以及局限性

如果开发人员期望在持久化时请求已创建条目的导航属性(navigation property)&#xff0c;请使用可选的 expand 参数在与实体创建的 POST 请求相同的批处理请求中有效地执行此操作。 可选的 inactive 参数确定是否创建非活动 transient 上下文。 这样的上下文只会在属性更新时成…

Jaca集合(四)Vector集合底层源码分析

Vector的基本介绍&#xff1a; &#xff08;1&#xff09;Vector类的定义说明&#xff1a;我们进入源码界面进行查看&#xff1a; public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable &#…