当前位置: 首页 > news >正文

LeetCode 129, 133, 136

文章目录

  • 129. 求根节点到叶节点数字之和
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 133. 克隆图
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 136. 只出现一次的数字
    • 题目链接
    • 标签
    • 思路
    • 代码


129. 求根节点到叶节点数字之和

题目链接

129. 求根节点到叶节点数字之和

标签

树 深度优先搜索 二叉树

思路

由于本题需要 从 根节点 遍历到 叶子节点(无子节点的节点叫做叶子节点),所以可以使用 深度优先搜索 的思想:每次遍历一个节点就计算 当前的路径(从根节点到当前节点)所表示的数字,然后将其传递给它的两棵子树,对 在两棵子树求得的所有路径之和 求和 并 返回。

像这样从 根节点叶子节点 遍历,如果遍历到叶子节点,则返回 从 根节点 到 此叶子节点 的路径所表示的数字。此外,可能会遇到一个当前节点为 null 的情况,此时返回 0 作为路径即可。

代码

class Solution {public int sumNumbers(TreeNode root) {return dfs(root, 0);}// curr 是当前遍历的节点,currNum 是从根节点到 curr 的路径所表示的数字private int dfs(TreeNode curr, int currNum) {if (curr == null) { // 如果 curr 为 nullreturn 0; // 则返回 0}int num = currNum * 10 + curr.val; // 计算从根节点到 curr 的路径所表示的数字if (curr.left == null && curr.right == null) { // 如果到叶子节点return num; // 则返回从根节点到这个叶子节点的路径所表示的数字}return dfs(curr.left, num) // 遍历左子树,求左子树中的所有路径之和+ dfs(curr.right, num); // 遍历右子树,求右子树的所有路径之和}
}

133. 克隆图

题目链接

133. 克隆图

标签

深度优先搜索 广度优先搜索 图 哈希表

思路

本题和 LeetCode 138. 随机链表的复制 类似,使用的方法完全一样,都是 建立旧节点与新节点的映射,不过与之不同的一点是:138 题中链表的结构没有这么复杂,而本题将基础链表中的 next 指针变成了一个 neighbors 指针集合,这就意味着本题无法像 138 题一样遍历链表来为新节点的属性赋值,而需要使用别的遍历方式——深度优先搜索(本方式复用了 cloneGraph() 方法,求旧节点所对应的新节点):

  • 如果旧节点为 null,则返回 null
  • 如果已经建立过 旧节点 和 新节点 的映射,则直接返回新节点。
  • 如果没有建立 旧节点 和 新节点 的映射,则需要构建新节点,分为以下三步:
    1. 创建新节点:给新节点的 val 属性赋值。
    2. 保存 旧节点 和 新节点 的映射。
    3. 给新节点的 neighbors 属性赋值:构建新节点之间的 neighbor 关系。

注意:构建新节点的第二、三步不能调换顺序。因为本节点的 neighborneighbor 是本节点,这两个节点之间会 互相获取对方的新节点,而 要返回本节点的新节点就需要先获取对方节点的新节点,从而进入死循环。

代码

class Solution {// 给定一个旧节点,返回其对应的新节点public Node cloneGraph(Node oldNode) {if (oldNode == null) { // 如果 旧节点 为 nullreturn null; // 则返回 null}if (mapper.containsKey(oldNode)) { // 如果已经建立过 旧节点 和 新节点 的映射return mapper.get(oldNode); // 则直接返回 旧节点 对应的 新节点}// 构建 新节点,给新节点的 neighbors 链表初始化指定的大小,避免 后续扩容 浪费时间Node newNode = new Node(oldNode.val, new ArrayList<>(oldNode.neighbors.size()));mapper.put(oldNode, newNode); // 先保存 旧节点 和 新节点 的映射for (Node neighbor : oldNode.neighbors) { // 然后再构建新节点之间的 neighbor 关系// 按照顺序寻找 新节点 对应的 新 neighbornewNode.neighbors.add(cloneGraph(neighbor));}return newNode; // 返回新节点}// 映射 旧节点 和 新节点 的映射,key 为 旧节点,value 为 新节点private Map<Node, Node> mapper = new HashMap<>();
}

136. 只出现一次的数字

题目链接

136. 只出现一次的数字

标签

位运算 数组

思路

异或的定义是:相同为假,不同为假。例如对于两个二进制数 0101, 1001,它们异或的结果为 0101 ^ 1001 = 1100

本题考查了一个位运算的知识:对两个数使用 异或 操作得到的结果如下:

  • 如果两个数相等,则结果为 0。这是因为两个数相等代表其二进制数相等,而相同为假,所以异或的结果全是 0,从而两个相等的数的异或结果为 0
  • 如果是 0 ^ 某个数,则结果为 某个数。这种情况举个例子更好理解:例如对于 0000, 1101,它们异或的结果为 1101,恰好与这个数相等。
  • 对于其他情况,结果通常没有具体意义。

多个数进行异或操作 就是 复合了多个 两数异或 的结果,例如 0011 ^ 1100 ^ 0011 = 0 ^ 1100 = 1100

所以可以遍历数组,对所有数使用异或操作,出现两次的数都抵消成 0 了,出现一次的数最终和 0 进行异或操作,得到它本身。

代码

class Solution {public int singleNumber(int[] nums) {int res = nums[0];for (int i = 1; i < nums.length; i++) {res ^= nums[i];}return res;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鸿蒙界面开发
  • Redis 主从搭建
  • 过滤出List集合的元素是Person对象,过滤出每个元素非null的name字段得到String类型的集合
  • vue侦听器(Watch)精彩案例剖析一
  • Redission中的Lua脚本写法、理解
  • Python面试题:Python中的单例模式及其实现
  • 基于单片机控制的锂电池充电和保护系统研究
  • 项目实战二
  • 利用Java调用人脸身份证比对接口
  • Prometheus监控Elasticsearch
  • 聚观早报 | Meta将推出新款AR眼镜;iPhone SE 4将升级显示屏
  • shell脚本教程学习
  • Qt:26.Qt项目:贪吃蛇游戏
  • redis全局唯一ID生成策略、countDownLatch、Lambda表达式总结
  • 《峡谷小狐仙-多模态角色扮演游戏助手》复现流程
  • 【知识碎片】第三方登录弹窗效果
  • ➹使用webpack配置多页面应用(MPA)
  • Apache Zeppelin在Apache Trafodion上的可视化
  • create-react-app项目添加less配置
  • Fabric架构演变之路
  • JAVA SE 6 GC调优笔记
  • Java,console输出实时的转向GUI textbox
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • Vue2 SSR 的优化之旅
  • vue-cli在webpack的配置文件探究
  • Vue全家桶实现一个Web App
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 如何优雅地使用 Sublime Text
  • 使用 Docker 部署 Spring Boot项目
  • 思否第一天
  • 推荐一个React的管理后台框架
  • 详解NodeJs流之一
  • 项目管理碎碎念系列之一:干系人管理
  • 一个完整Java Web项目背后的密码
  • 在Mac OS X上安装 Ruby运行环境
  • #DBA杂记1
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (7)摄像机和云台
  • (八十八)VFL语言初步 - 实现布局
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (回溯) LeetCode 78. 子集
  • (一)kafka实战——kafka源码编译启动
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .cn根服务器被攻击之后
  • .Net Core 微服务之Consul(二)-集群搭建
  • .NET Framework .NET Core与 .NET 的区别
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 反射的使用
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [] 与 [[]], -gt 与 > 的比较