力扣打卡 1457-二叉树中的伪回文路径

Problem: 1457. 二叉树中的伪回文路径

思路

首先想用最暴力的深度优先DFS,使用traversePaths方法来遍历二叉树并存储所有路径。该方法接收当前节点、当前路径和路径列表作为参数。当到达叶子节点时,将当前路径添加到路径列表中。

然后,我们遍历每条路径,并调用isPseudoPalindromic方法来判断路径是否为伪回文。更新结果并输出。

这样能跑二叉树体量较小的用例,代码中使用了一个路径列表paths来存储所有的路径,这也会占用大量的内存空间,特别是当二叉树非常大时,路径数量可能非常庞大,导致内存消耗过大。

如何优化?

因为节点的值只可能为1到9,因此可以用一个长度为10的数组counter来记录路径中各个值出现的次数。
并且用深度优先搜索的方式来遍历所有叶子,定义函数dfs,输入为接下去要访问的节点,和记录了根节点到该节点(不含)的路径上各个值出现的次数的数组counter,并返回一个整数,用来表示根节点到以该节点为祖先的叶子节点的所有路径中伪回文路径的数目。

解题方法

  1. 首先判断该节点是否为空,如果为空,则返回0。
  2. 接下来更新counter,表示访问到了当前节点。然后判断当前节点是否为叶子节点,如果是,按照isPseudoPalindromic方法判断counter 中的所有元素是否能构成一个回文序列。
  3. 如果不是叶子节点,则分别访问当前节点的两个子节点,将返回值求和作为自己的返回值。
  4. 最后在返回之前,需要撤销一开始对counter的更新。
  5. 对根节点root进行dfs的调用,返回即可。

复杂度

时间复杂度:
O ( C ∗ n ) O(C*n) O(Cn)
C 是节点中不同元素的数量,n 是二叉树的节点数。二叉树中的每个元素都会被访问到,每次访问到叶子节点判断是否为伪回文路径消耗 O ( C ) O(C) O(C)

空间复杂度:
O ( n ) O(n) O(n)
深度优先搜索的深度最深为n

Code

暴力DFS(大体量二叉树会爆内存)

class Solution {public int pseudoPalindromicPaths (TreeNode root) {//定义每条路径和当前路径List<List<Integer>> paths = new ArrayList<>();List<Integer> currentpath = new ArrayList<>();//调用辅助方法遍历路径并存储traversePaths(root,paths,currentpath);int res = 0;//遍历每条路径for(List<Integer> path:paths){//判断是否回文(写个函数)if(isPseudoPalindromic(path)){res++;}}return res;}private void traversePaths(TreeNode node,List<List<Integer>> paths,List<Integer> currentpath){if(node == null){return;}currentpath.add(node.val);//将当前节点的值添加到当前路径// 到达叶节点时,将当前路径添加到路径列表中if (node.left == null && node.right == null) {paths.add(new ArrayList<>(currentpath));}//递归遍历左子树和右子树traversePaths(node.left,paths,currentpath);traversePaths(node.right,paths,currentpath);//移除当前节点的值,回到上一层currentpath.remove(currentpath.size() - 1);}private boolean isPseudoPalindromic(List<Integer> path){int[] counts = new int[10]; // 用于计数每个数字(0-9)出现的次数// 统计路径中每个数字的出现次数for (int num : path) {counts[num]++;}int oddCount = 0; // 奇数次出现的数字的数量// 检查路径是否是伪回文的for (int count : counts) {if (count % 2 != 0) { // 如果数字出现次数为奇数oddCount++;}}   return oddCount <= 1; // 如果最多只有一个数字出现次数为奇数,则返回true}
}

DFS更新counter(题解)

class Solution {public int pseudoPalindromicPaths (TreeNode root) {int[] counter = new int[10];return dfs(root,counter);}public int dfs(TreeNode node, int[] counter){if(node == null){return 0;}counter[node.val]++;int res = 0;if(node.left == null && node.right == null){if(isPseudoPalindrome(counter)){res = 1;}}else{res = dfs(node.left,counter) + dfs(node.right,counter);}counter[node.val]--;return res;}public boolean isPseudoPalindrome(int[] counter){int odd = 0;for(int value : counter){if(value % 2 == 1){odd++;}}return odd <= 1;}
}

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

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

相关文章

linux rpm安装软件卸载 以卸载mysql为例

查看rpm包 rpm -qa | grep 内容 卸载rpm rpm -e --nodeps rpm名称

【Unity实战】切换场景加载进度和如何在后台异步加载具有庞大世界的游戏场景,实现无缝衔接(附项目源码)

文章目录 最终效果前言一、绘制不同的场景二、切换场景加载进度1. 简单实现2. 优化 三、角色移动和跳跃控制四、添加虚拟摄像机五、触发器动态加载场景六、最终效果参考源码完结 最终效果 前言 观看本文后&#xff0c;我的希望你对unity场景管理有更好的理解&#xff0c;并且能…

java - 二分查找

一、什么是二分查找 二分查找&#xff08;Binary Search&#xff09;&#xff0c;也称为折半搜索或对数搜索&#xff0c;是一种在有序数组或列表中查找特定元素的算法。它的工作原理是将待查找的区间一分为二&#xff0c;并确定目标值位于哪个子区间中&#xff0c;然后通过不断…

辅助驾驶功能开发-外部需求篇-导航式巡航辅助NCA外部依赖及需求

1.功能外部依赖 为了设计满足用户需求的 ICA/NCA 系统,需要用到的系统输入为:环境及驾驶员感知信息、 门锁监测信息、胎压监测信息、驾驶员权限管理、车辆模式管理信息、用户请求输入、转向系统 信息、惯性及导航定位信息、被动安全及约束信息、变速箱系统信息、制动系…

华为云之在Linux系统下安装可视化界面

华为云之在Linux系统下安装可视化界面 一、华为云弹性云服务器ECS介绍二、Linux图形化界面介绍三、本次实践介绍3.1 本次实践简介3.2 本次实践环境介绍 四、环境准备工作4.1 预置环境4.2 查看预置环境资源信息 五、连接弹性云服务器ECS5.1 登录华为云5.2 复制ECS弹性公网IP地址…

云计算学习哪些技术

1. 虚拟化技术 虚拟化是云计算的基础&#xff0c;因此了解虚拟化技术至关重要。学习虚拟化技术时&#xff0c;需要掌握以下知识点&#xff1a; - 操作系统虚拟化&#xff1a;了解基于宿主机和客户机的虚拟化技术&#xff0c;如VMware、Hyper-V等。 - 容器化技术&#xff1a;学习…

php的字符转义函数有那些,是干什么的

在 PHP 中&#xff0c;字符转义函数是用于处理字符串中的特殊字符&#xff0c;以防止这些字符被误解、滥用或引起安全问题的一组函数。这些函数的主要作用是确保在将用户提供的数据插入到数据库、构建 HTML 输出或进行其他与安全相关的操作时&#xff0c;不会导致潜在的安全漏洞…

C++最长公共子序列问题

#include <iostream> #include <cstring> using namespace std;const int MAXN 1005; int dp[MAXN][MAXN];int main() {string s1, s2;cin >> s1 >> s2;int len1 s1.length(), len2 s2.length();memset(dp, 0, sizeof(dp)); // 初始化为0// 动态规划…

人工智能 -- 神经网络

1、什么是神经网络 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这个无需解释太多&#xff0c;因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能&#xff1f; 从1956年夏季首次提出“人工智能”这…

leetcode设计循环队列(链表方式来实现)

上次我们那个设计循环队列的时候用的是数组&#xff0c;因为那个时候还是不太会链表&#xff0c;现在有了链表的思路&#xff0c;我们一起来看看解题步骤吧。 https://leetcode.cn/problems/design-circular-queue/description/ 设计循环队列 那我们其实最主要的就是我们这个…

SpringBoot——配置及原理

优质博文&#xff1a;IT-BLOG-CN 一、Spring Boot全局配置文件 application.properties与application.yml配置文件的作用&#xff1a;可以覆盖SpringBoot配置的默认值。 ◀ YML&#xff08;is not a Markup Language&#xff1a;不仅仅是一个标记语言&#xff09;&#xff1…

Linux find命令教程:如何使用查找文件及目录(附实例教程和注意事项)

Linux find命令介绍 Linux find命令是Linux系统管理员工具箱中最强大的工具之一。它根据用户给定的表达式在目录层次结构中搜索文件和目录&#xff0c;并可以对每个匹配的文件执行用户指定的操作。你可以使用find命令根据它们的权限、类型、日期、所有权、大小等搜索文件和目录…

centos 7.9 下利用miniconda里的pyinstaller打包python程序为二进制文件操作方法

centos 7.9 下利用miniconda里的pyinstaller打包python程序为二进制文件操作方法 一.centos 7.9 操作系统安装 参考&#xff1a;https://blog.csdn.net/qq_46015509/article/details/134572030?utm_sourceminiapp_weixin 安装完成后用后台连接工具连上虚拟机 二.安装python3 …

蓝桥杯第2119题 特殊时间 C++ 思维暴力

题目 思路和解题方法 1110 代表 1110年11月10号11点10分1110 4*4*4 有0111 1011 1101 1110 可以符合年 月日 时分秒的都有4种例如 1113有1113 1131 1311 3111 年份符合月日只有11 13 时分秒 只有11 13 11 31 13 11 无31 11 c 代码 #include <bits/stdc.h> using…

Linux进程管理,用户管理,文件压缩命令

gcc与g区别(补充了解): 比如有两个文件:main.c,mainc.cpp(分别用C语言和C语言写的)如果要用gcc编译呢? gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc 指明用c的标准库; 区别一: gcc默认只链接C库,并不会链接C的库;g会默认链接c标准库. 区别二: gcc编译.c文件,则按照C语…

【开源组件】- 关于Jetcache的使用

关于Jetcache的使用 &#x1f604;生命不息&#xff0c;写作不止 &#x1f525; 继续踏上学习之路&#xff0c;学之分享笔记 &#x1f44a; 总有一天我也能像各位大佬一样 &#x1f31d;分享学习心得&#xff0c;欢迎指正&#xff0c;大家一起学习成长&#xff01; JetCache是由…

K8s 中 Pod OOMKilled 原因

目录 Exit Code 137 解决方案 JVM 感知 cgroup 限制 使用 JDK9 的容器感知机制尝试 问题分析 容器内部感知 CGroup 资源限制 在 Java10 中&#xff0c;改进了容器集成 JVM 参数 MaxDirectMemorySize -XX:MaxDirectMemorySize 的默认值是什么&#xff1f; 其他获取 ma…

电源控制系统架构(PCSA)之电源管理基础设施组件

目录 6.5 电源管理基础设施组件 6.5.1 电源策略单元 6.5.2 时钟控制器 6.5.3 低功耗Distributor 6.5.4 低功耗Combiner 6.5.5 P-Channel到Q-Channel转换器 6.5 电源管理基础设施组件 6.5.1 电源策略单元 本节介绍电源策略单元(Power Policy Unit, PPU)。PPU的完整细节见…

Node.js 中的事件驱动架构

Node.js 中的事件驱动架构 事件驱动架构 (EDA) 已成为构建可扩展、响应式和松散耦合系统的强大范例。在 Node.js 中&#xff0c;EDA 发挥着关键作用&#xff0c;利用其异步特性和事件驱动功能来创建高效且健壮的应用程序。让我们深入研究 Node.js 中事件驱动架构的复杂性&…

Java核心知识点整理大全14-笔记

Java核心知识点整理大全-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全2-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全3-笔记_希斯奎的博客-CSDN博客 Java核心知识点整理大全4-笔记-CSDN博客 Java核心知识点整理大全5-笔记-CSDN博客 Java核心知识点整理大全6…