【每日力扣】235. 二叉搜索树的最近公共祖先与39. 组合总和问题描述

在这里插入图片描述

🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。

235. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]

img

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6
解释: 节点 2 和节点 8 的最近公共祖先是 6。

首先,让我们回顾一下二叉搜索树的性质:

  1. 二叉搜索树是一种有序树,对于任意节点,其左子树中的所有节点的值均小于该节点的值,右子树中的所有节点的值均大于该节点的值。
  2. 二叉搜索树中不存在重复的节点值。

基于这些性质,我们可以利用递归或迭代的方法来寻找最近公共祖先。

方法一:递归

递归是一种直观且常用的方法,它可以通过不断地向下递归来找到最近公共祖先。

步骤:
  1. 从根节点开始遍历树。
  2. 如果当前节点的值大于 p 和 q 的值,则最近公共祖先在当前节点的左子树中。
  3. 如果当前节点的值小于 p 和 q 的值,则最近公共祖先在当前节点的右子树中。
  4. 如果当前节点的值介于 p 和 q 的值之间(包括 p 和 q 的值),则当前节点就是最近公共祖先。
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class LowestCommonAncestorBST {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if (root == null) return null;if (root.val > p.val && root.val > q.val) {return lowestCommonAncestor(root.left, p, q);} else if (root.val < p.val && root.val < q.val) {return lowestCommonAncestor(root.right, p, q);} else {return root;}}
}

方法二:迭代

迭代方法则利用 BST 的特性,在遍历过程中找到最近公共祖先。

步骤:
  1. 从根节点开始,不断循环直到找到最近公共祖先。
  2. 如果当前节点的值大于 p 和 q 的值,则最近公共祖先在当前节点的左子树中。
  3. 如果当前节点的值小于 p 和 q 的值,则最近公共祖先在当前节点的右子树中。
  4. 如果当前节点的值介于 p 和 q 的值之间(包括 p 和 q 的值),或者当前节点的值等于 p 或 q 的值,则当前节点就是最近公共祖先。
import java.util.LinkedList;
import java.util.Queue;class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class LowestCommonAncestorBST {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {while (root != null) {if (root.val > p.val && root.val > q.val) {root = root.left;} else if (root.val < p.val && root.val < q.val) {root = root.right;} else {return root;}}return null;}
}

39. 组合总和问题描述

给定一个无重复元素的整数数组 candidates 和一个目标整数 target,要求找出 candidates 中可以使数字和为目标数 target 的所有不同组合,并以列表形式返回。同一个数字可以被选取多次,不同数量的数字被选取算作不同的组合。

示例

假设 candidates = [2, 3, 6, 7]target = 7,则组合总和为 7 的所有不同组合有 [[2, 2, 3], [7]]

解题思路

要解决组合总和问题,可以使用回溯算法来搜索所有可能的组合。回溯算法是一种递归的搜索方法,它通过不断地探索所有可能的路径,并在搜索过程中进行剪枝,以提高效率。

下面是使用回溯算法解决组合总和问题的步骤:

  1. 对候选数组 candidates 进行排序,方便剪枝和去重。
  2. 定义一个回溯函数 backtrack(start, target, path),其中 start 表示当前搜索的起始位置,target 表示当前目标数,path 表示当前的组合路径。
  3. 在回溯函数中,如果 target == 0,说明找到了一组组合,将其加入结果列表中并返回。
  4. 如果 target < 0,说明当前组合不合法,直接返回。
  5. 对于每个候选数,递归搜索其下一层可能的组合,更新 starttargetpath,然后继续调用回溯函数。
  6. 最终返回所有满足条件的组合。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class CombinationSum {public static List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> result = new ArrayList<>();Arrays.sort(candidates); // 对候选数组排序,方便剪枝和去重backtrack(candidates, target, 0, new ArrayList<>(), result);return result;}private static void backtrack(int[] candidates, int target, int start, List<Integer> path, List<List<Integer>> result) {if (target == 0) {// 找到一组组合,加入结果列表中result.add(new ArrayList<>(path));return;}if (target < 0) {// 当前组合不合法,直接返回return;}for (int i = start; i < candidates.length; i++) {path.add(candidates[i]); // 将当前候选数加入组合路径// 递归搜索下一层可能的组合backtrack(candidates, target - candidates[i], i, path, result);path.remove(path.size() - 1); // 回溯,移除最后一个候选数}}public static void main(String[] args) {int[] candidates = {2, 3, 6, 7};int target = 7;List<List<Integer>> result = combinationSum(candidates, target);System.out.println(result); // 输出 [[2, 2, 3], [7]]}
}

在这里插入图片描述

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

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

相关文章

Python中类方法和静态方法的区别你知道吗?

​1.类方法 通过 classmethod 装饰器修饰的方法就是类方法 类方法可以通过类名或对象名调用&#xff0c;但是一般情况下使用类名调用&#xff08;节省内存&#xff09; 类方法中没有self.在类方法中不可以使用其它对象的属性和方法 类方法中一般会有一个参数cls&#xff0c;…

Crc冗余校验码设计

串行电路的位置&#xff0c;有异或门的地方是1&#xff08;生成多项式&#xff09; 简单的来说&#xff0c;如果最高位Q4 为0 的话&#xff0c;那么直接和 0 进行异或的话&#xff0c;实现的也是自己本身&#xff0c;直接左移就可以了 如果最高是1的话&#xff0c;那么就要和生…

【数据结构与算法】:选择排序与快速排序

&#x1f525;个人主页&#xff1a; Quitecoder &#x1f525;专栏&#xff1a;数据结构与算法 我的博客即将同步至腾讯云开发者社区&#xff0c;邀请大家一同入驻&#xff1a;腾讯云 欢迎来到排序的第二个部分&#xff1a;选择排序与快速排序&#xff01; 目录 1.选择排序1.…

如何export windows中的环境变量

在大语言模型&#xff08;LLM&#xff09;学习过程中&#xff0c; 利用 jupyter 导入环境变量时出现以下问题&#xff0c; C:\Users\zhangxuantao>export SENSENOVA_SKxxxxxx export 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 原因是学习教程中用…

VTK安装(C++)并配置vs

准备工作&#xff1a; 1.VTK下载包(此教程使用VTK8.2.0) 2.CMAKE(此教程使用3.29.0) 在此不过多赘述&#xff0c;可在网上搜索cmake安装 3.visual studio(此教程使用vs2019) VTK下载及编译&#xff1a; 1、找到自己适合的VTK版本,我选择的是VTK8.2.0。 1.1 官网下载&#xff…

天水麻辣烫榜上有名!2024适合普通人的创业项目!2024最适合创业的三大行业!2024热门创业项目!

1、天水麻辣烫 最近济南6天开了4家甘肃麻辣烫天天爆满 有店日营业额破万元有店主飞甘肃天水学习5天回来迅速开店&#xff01;选择天水麻辣烫作为创业项目绝对是一个明智的选择。趁着现在的热度&#xff0c;开设一家门店&#xff0c;借助其已经积累的名气和口碑&#xff0c;创业…

Docker常用命令的使用及镜像的构建

1.docker的好处 在开发中可能会遇到一个问题&#xff0c;一个程序在自己电脑上能跑&#xff0c;但是换到服务器上就不行了。如果我们重新搭建环境&#xff0c;需要重新部署mysql,es,redis等组件很麻烦。有了docker之后&#xff0c;我们可以快速完成项目的部署。同时docker的隔…

L1-072 刮刮彩票 分数 20 (巧用一维数组,数组加和)

啊啊啊啊啊啊啊啊明明就想出来了&#xff0c;明明就&#xff0c;就差这2分为什么为什么啊&#xff01;&#xff01;&#xff01;忘记当 tt 大于3小于6时应该 - 3 了&#xff0c;哎呦喂&#xff0c;三位的数组哪有4&#xff0c;5&#xff0c;6啊啊啊啊啊忘记减了&#xff0c;忘了…

C语言数据结构(7)——树、二叉树前言

欢迎来到博主的专栏——C语言数据结构 博主ID&#xff1a;代码小豪 文章目录 树二叉树特殊二叉树满二叉树完全二叉树 完全二叉树的存储结构 树 树是一个非线性的数据结构&#xff0c;由N个结点构成的集合。 树的各个结点由一个根结点联系起来&#xff0c;这个根节点没有前驱…

电子科技大学链时代工作室招新题C语言部分---题号E

1. 题目 这道题大概的意思是说&#xff0c;一座城市中被埋了许多雷&#xff08;用一个只含0和1的字符串表示城市&#xff0c;1代表有雷&#xff0c;0代表无雷&#xff09;。 你作为一个排雷兵&#xff0c;需要花最少的钱引爆所有的雷来使城市中不再有雷&#xff08;太逆天了&a…

【小白刷leetcode】第15题

【小白刷leetcode】第15题 动手刷leetcode&#xff0c;正在准备蓝桥&#xff0c;但是本人算法能力一直是硬伤。。。所以做得一直很痛苦。但是不熟练的事情像练吉他一样&#xff0c;就需要慢速&#xff0c;多练。 题目描述 看这个题目&#xff0c;说实在看的不是很懂。索性我们直…

基于Java+SpringMVC+vue+element实现前后端分离校园失物招领系统详细设计

基于JavaSpringMVCvueelement实现前后端分离校园失物招领系统详细设计 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收…