【每日力扣】40.组合总和II与701. 二叉搜索树中的插入操作

在这里插入图片描述

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

40.组合总和II

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的每个数字在每个组合中只能使用 一次

**注意:**解集不能包含重复的组合。

示例 1:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]

示例 2:

输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

问题分析

首先,我们需要明确题目中的要求和限制条件:

  • 给定一个正整数数组 candidates 和一个目标数 target
  • 数组中的每个数字在每个组合中只能使用一次。
  • 解集不能包含重复的组合。

我们需要找出所有满足条件的组合,将它们以列表形式返回。

解题思路

  1. 排序数组:为了方便后续的剪枝操作和去重操作,我们首先对数组进行排序。

  2. 回溯搜索:使用回溯算法进行搜索,定义一个回溯函数 backtrack,参数包括当前的目标数 target、搜索起始位置 start、当前组合路径 path 和结果列表 result

  3. 搜索过程

    :在回溯函数中,我们逐个遍历数组中的数字,并进行如下操作:

    • 如果当前目标数为0,说明找到了一组满足条件的组合,将其加入结果列表中。
    • 如果当前目标数小于0,说明当前组合不合法,直接返回。
    • 对于每个数字,如果它和前一个数字相同且在同一层级上,则跳过,避免重复组合。
    • 否则,将当前数字加入组合路径,递归搜索下一层可能的组合,更新目标数和搜索起始位置,然后回溯移除最后一个数字,继续搜索下一个数字。
  4. 返回结果:最终返回结果列表中的所有组合。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class CombinationSumII {public static List<List<Integer>> combinationSum2(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++) {// 避免重复组合,跳过相同的数字if (i > start && candidates[i] == candidates[i - 1]) {continue;}path.add(candidates[i]); // 将当前候选数加入组合路径// 递归搜索下一层可能的组合,起始位置为 i+1,因为每个数字只能使用一次backtrack(candidates, target - candidates[i], i + 1, path, result);path.remove(path.size() - 1); // 回溯,移除最后一个候选数}}public static void main(String[] args) {int[] candidates1 = {10, 1, 2, 7, 6, 1, 5};int target1 = 8;List<List<Integer>> result1 = combinationSum2(candidates1, target1);System.out.println(result1); // 输出 [[1, 1, 6], [1, 2, 5], [1, 7], [2, 6]]int[] candidates2 = {2, 5, 2, 1, 2};int target2 = 5;List<List<Integer>> result2 = combinationSum2(candidates2, target2);System.out.println(result2); // 输出 [[1, 2, 2], [5]]}
}

701. 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果

示例 1:

img

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]

问题分析

插入操作需要考虑二叉搜索树的特性,即左子树的值小于根节点的值,右子树的值大于根节点的值。因此,在插入节点时,我们需要找到合适的位置插入,并保持树的二叉搜索树性质。

解题思路

我们可以通过递归或迭代的方式来实现插入操作。具体步骤如下:

  1. 如果根节点为空,则直接将新节点作为根节点返回。
  2. 如果要插入的值小于根节点的值,则递归插入到左子树中。
  3. 如果要插入的值大于根节点的值,则递归插入到右子树中。
  4. 最后返回根节点。
class TreeNode {int val;TreeNode left;TreeNode right;TreeNode(int x) { val = x; }
}public class InsertIntoBST {public TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) {return new TreeNode(val);}if (val < root.val) {root.left = insertIntoBST(root.left, val);} else if (val > root.val) {root.right = insertIntoBST(root.right, val);}return root;}public static void main(String[] args) {// 示例用例TreeNode root = new TreeNode(4);root.left = new TreeNode(2);root.right = new TreeNode(7);root.left.left = new TreeNode(1);root.left.right = new TreeNode(3);int val = 5;InsertIntoBST solution = new InsertIntoBST();TreeNode result = solution.insertIntoBST(root, val);// 输出结果System.out.println(result);}
}

在这里插入图片描述

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

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

相关文章

计算机网络——物理层(奈氏准则和香农定理)

计算机网络——物理层&#xff08;奈氏准则和香农定理&#xff09; 失真码间串扰奈氏准则&#xff08;奈奎斯特定理&#xff09;极限数据率 噪声信噪比香农定理奈氏准则和香农定理的区别 前面我们已经了解一些数据通信的基本知识&#xff0c;没有看过上一篇得小伙伴可以点击这里…

Android 系统的启动过程

Android 系统的启动流程&#xff1a; RomBoot&#xff08;只读存储器引导程序&#xff09;&#xff1a;这是设备上电时运行的初始软件。RomBoot执行基本的硬件初始化&#xff0c;确保硬件处于可以运行后续启动阶段的状态。这一阶段非常重要&#xff0c;因为它为整个启动过程奠定…

Educational Codeforces Round 163 (Rated for Div. 2) (A~C)

Educational Codeforces Round 163 (Rated for Div. 2) (A~C) 目录&#xff1a;A B C A题&#xff1a;Special Characters 标签: 暴力枚举&#xff08;brute force&#xff09;构造算法&#xff08;constructive algorithms&#xff09; 题目大意 构造一个字符串含有n个特殊…

LCD屏的应用

一、LCD屏应用 Linux下一切皆文件&#xff0c;我们的LCD屏再系统中也是一个文件&#xff0c;设备文件&#xff1a;/dev/fb0。 如果要在LCD屏显示数据&#xff0c;那我们就可以把数据写入LCD屏的设备文件。 1.显示颜色块 LCD屏分辨&#xff1a;800*480 像素 32位:说明一个像…

JAVA---学生管理系统

遍历字符串 ArrayList学习&#xff1a;

CCF 202009-3 点亮数字人生(拓扑排序)

题目背景 土豪大学的计算机系开了一门数字逻辑电路课&#xff0c;第一个实验叫做“点亮数字人生”&#xff0c;要用最基础的逻辑元件组装出实际可用的电路。时间已经是深夜了&#xff0c;尽管实验箱上密密麻麻的连线已经拆装了好几遍&#xff0c;小君同学却依旧没能让她的电路正…

【MySQL基础】MySQL基础操作三

文章目录 &#x1f349;1.联合查询&#x1f95d;笛卡尔积 &#x1f349;2.内连接&#x1f95d;查询单个数据&#x1f95d;查询多个数据 &#x1f349;3.外连接&#x1f349;4.自连接&#x1f349;5.合并查询 &#x1f349;1.联合查询 &#x1f95d;笛卡尔积 实际开发中往往数…

【软件测试】软件测试的基本概念和开发模型

1. 前言 在进行软件测试的学习之前,我们要了解软件测试一些基本概念. 这些基本概念将帮助我们更加明确工作的目标以及软件测试到底要做什么. 2. 软件测试的基本概念 软件测试的基本概念有3个,分别是需求,测试用例和BUG. 2.1 需求 这里的需求还可以分为 用户需求和软件需求,用…

python 第三方库(PyPinyin\shortuuid\json)

PyPinyin库 简介 PyPinyin库是一个支持中文转拼音输出的Python第三方库&#xff0c;它可以根据词组智能匹配最正确的拼音&#xff0c;并且支持多音字&#xff0c;简单的繁体, 注音&#xff0c;多种不同拼音/注音风格的转换。 安装 (framework-learn) C:\Users\zzg>pip …

python类对象

类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象 类型&#xff0c;从而能够创建该类型的新 实例。实例具有能维持自身状态的属性&#xff0c;还具有能修改自身状态的方法&#xff08;由其所属的类来定义&#xff09;。 和其他编程语言相比&#xff0c;Python…

QT for Mcu的学习建议

QT for MCU&#xff08;微控制器单元&#xff09;是一个相对较新的领域&#xff0c;它允许在资源受限的微控制器上运行Qt框架&#xff0c;从而为嵌入式设备带来丰富的用户界面和跨平台的开发体验。以下是一些建议&#xff0c;可以帮助你开始学习Qt for MCU&#xff1a; 理解Qt…

从遍历上来说,list是单向的,vector是双向的。这句话对吗

从遍历的角度来说&#xff1a; 对于list来说&#xff0c;虽然它是双向链表&#xff0c;每个节点都包含指向前一个节点和后一个节点的指针&#xff0c;但在实际遍历时&#xff0c;我们通常只能沿着一个方向&#xff08;比如从头到尾或从尾到头&#xff09;进行遍历&#xff0c;因…

图像去噪--(1)

系列文章目录 文章目录 系列文章目录前言一、图像噪声1.1 噪声定义1.2 基本特征 二、按照噪声概率分布分类1.高斯噪声2.泊松噪声 三、去噪算法3.1 线性滤波3.1.1 高斯滤波3.1.2 均值滤波 3.2 非线性滤波3.2.1 中值滤波3.2.2 双边滤波 四、深度学习总结 前言 一、图像噪声 1.1 …

条款09:绝不在析构和构造中调用virtual函数

1.为什么 #include<iostream> using namespace std;class Transaction//交易信息类 {Transaction();virtual void logTransaction()const 0;//交易日志 };Transaction::Transaction() {logTransaction(); }class BuyTransaction : public Transaction//买入操作 {virtu…

Springboot全局异常处理

Springboot全局异常处理 一、不使用全局异常处理器二、全局异常处理器1.自定义常量&#xff08;返回状态码&#xff09;2.手动抛出异常3.编写全局异常处理器4.测试结果 三、全局异常处理方式二1.定义状态码常量2. 定义基础接口&#xff08;面向接口编程&#xff09;3.定义枚举类…

湖南麒麟SSH服务漏洞

针对湖南麒麟操作系统进行漏洞检测时&#xff0c;会报SSH漏洞风险提醒&#xff0c;具体如下&#xff1a; 针对这些漏洞&#xff0c;可以关闭SSH服务&#xff08;前提是应用已经部署完毕不再需要通过SSH远程访问传输文件的情况下&#xff0c;此时可以通过VNC远程登录方法&#x…

JMeter基础 — JMeter聚合报告详解

提示&#xff1a;聚合报告组件的使用和察看结果树组件的使用方式相同。本篇文章主要是详细的介绍一下聚合报告组件内容&#xff0c;不做示例演示。 1、聚合报告介绍 在使用JMeter进行性能测试时&#xff0c;聚合报告(Aggregate Report)可以说是必用的监听器。 &#xff08;1&…

Internet协议的安全性

Internet协议的安全性 文章目录 Internet协议的安全性1. 网络层1. IP*62. ARP*33. ICMP * 3 2. 传输层协议1. TCP1. * SYN-Flood攻击攻击检测* 防御 2. TCP序号攻击攻击 3. 拥塞机制攻击 2. UDP 3. 应用层协议1. DNS攻击*3防范*3: 2. FTP3. TELNET: 改用ssh4. 电子邮件1. 攻击2…

【Javascript编程实操06】1、反转数组和字符串 2、将二维数组转一维数组

前言 1、反转数组和字符串 代码&#xff1a; 实现效果&#xff1a; 2、将二维数组转一维数组 代码&#xff1a; 实现效果&#xff1a; 总结 前言 本次主要是针对Javascript阶段的字符串与数组的实操练习&#xff0c;共有2个实操&#xff0c;大家可以在实操的过程中更加深…

什么时候去检测大数据信用风险比较合适?

什么时候去检测大数据信用风险比较合适?在当今这个数据驱动的时代&#xff0c;大数据信用风险检测已经成为个人的一项重要需求。本文将从贷前检测、信息泄露检测和定期检测三个方面&#xff0c;阐述何时进行大数据信用风险检测较为合适。 一、贷前检测 大数据信用风险检测在贷…