【算法刷题 | 回溯思想 03】4.13( 组合总和、组合总和|| )

在这里插入图片描述

文章目录

  • 5.组合总和
    • 5.1题目
    • 5.2解法:回溯
      • 5.2.1回溯思路
        • (1)函数返回值以及参数
        • (2)终止条件
        • (3)遍历过程
      • 5.2.2代码实现
  • 6.组合总和 ||
    • 6.1题目
    • 6.2解法:回溯
      • 6.2.1回溯思路
        • (1)函数返回值以及参数
        • (2)终止条件
        • (3)遍历过程
      • 6.2.2代码

5.组合总和

5.1题目

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。

candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。

对于给定的输入,保证和为 target 的不同组合数少于 150 个。

  • 示例一:
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
  • 示例二:
输入: candidates = [2,3,5], target = 8
输出: [[2,2,2,2],[2,3,3],[3,5]]
  • 示例三:
输入: candidates = [2], target = 1
输出: []

5.2解法:回溯

5.2.1回溯思路

  • 注意:题目本质为在同一个集合中求组合,所以需要startIndex,作为每次遍历的开始;
  • 因为题目表明同一个数字可以 无限制被选取,所以每次递归遍历,需要从包含当前字母(下标为i)开始遍历

image-20240413201325087

(1)函数返回值以及参数
private void backing(int[] candidates, int target, int sum, int startIndex)
(2)终止条件
if(sum==target){
	res.add(new ArrayList<>(paths));
    return;
}
if(sum>target){
    return;
}
(3)遍历过程
for(int i=startIndex;i<candidates.length();i++){
    paths.add(candidates[i]);
    sum+=candidates[i];
    backing(candidates,target,sum,i);
    //回溯
   	paths.remove(paths.size()-1);
    sum-=candidates[i];
}

5.2.2代码实现

	List<List<Integer>> res=new ArrayList<>();
    List<Integer> paths=new ArrayList<>();

    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        backing(candidates,target,0,0);
        return res;
    }

    private void backing(int[] candidates, int target, int sum, int startIndex){
        if(sum==target){
	        res.add(new ArrayList<>(paths));
            return;
        }
        if(sum>target){
            return;
        }
        for(int i=startIndex;i<candidates.length;i++){

            paths.add(candidates[i]);
            sum+=candidates[i];
            backing(candidates,target,sum,i);

            //回溯
   	        paths.remove(paths.size()-1);
            sum-=candidates[i];
        }
    }

6.组合总和 ||

6.1题目

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

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

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

  • 示例一:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
输出:
[
[1,1,6],
[1,2,5],
[1,7],
[2,6]
]
  • 示例二:
输入: candidates = [2,5,2,1,2], target = 5,
输出:
[
[1,2,2],
[5]
]

6.2解法:回溯

6.2.1回溯思路

  • 注意:题目本质为在同一个集合中求组合,所以需要startIndex,作为每次遍历的开始
  • 因为题目表明同一个数字不可以 无限制被选取,所以每次递归遍历,需要从下一个字母遍历
  • 因为同一个数字,在树中只能用一遍
    • 思路:将数组排序(重复的元素肯定相邻)
    • 遍历该元素时,首先判断元素和上一个元素是否相同(即是否使用过),并且通过标记数组判断是在同一树枝(还是同一树层)使用过
    • 若为同一树枝(从上到下),则可以使用该元素;若为同一树层,则不可以使用该元素
    • 如图所示:

image-20240413205953207

(1)函数返回值以及参数
private void backing(int[] candidates, int target, int startIndex, boolean[] isUsed);
(2)终止条件
if(sum==target){
	res.add(new ArrayList<>(paths));
    return;
}
if(sum>target){
    return;
}
(3)遍历过程
for(int i=startIndex;i<candidates.length();i++){
    
    if(i!=0 && candidates[i]==candidates[i+1] && isUsed[i-1]==false){
        //该元素在同一树层中已经使用过了,不能再使用(不同位置上的数字只能 用一次)
        //若 isUsed[i-1]=true,则表明该元素在同一树枝上使用,不会影响该元素使用(不同位置)
        continue;
    }
    
    paths.add(candidates[i]);
    sum+=candidates[i];
    isUsed[i]=true;
    backing(candidates,target,i+1,isUsed);
    //回溯
   	paths.remove(paths.size()-1);
    sum-=candidates[i];
    isUsed[i]=false;
}

6.2.2代码

	List<List<Integer>> res=new ArrayList<>();
    List<Integer> paths=new ArrayList<>();
    boolean[] isUsed;
    
    int sum=0;

    public List<List<Integer>> combinationSum2(int[] candidates, int target) {

        Arrays.sort(candidates);    //排序,确保相同元素相邻
        
        isUsed=new boolean[candidates.length];
        Arrays.fill(isUsed, false);

        backing(candidates,target,0);
        return res;
    }

    private void backing(int[] candidates, int target, int startIndex){

        if(sum==target){
	        res.add(new ArrayList<>(paths));
            return;
        }
        if(sum>target){
            return;
        }
        for(int i=startIndex;i<candidates.length;i++){
    
            if(i!=0 && candidates[i]==candidates[i-1] && isUsed[i-1]==false){
                //该元素在同一树层中已经使用过了,不能再使用(不同位置上的数字只能 用一次)
                //若 isUsed[i-1]=true,则表明该元素在同一树枝上使用,不会影响该元素使用(不同位置)
                continue;
            }
    
            paths.add(candidates[i]);
            sum+=candidates[i];
            isUsed[i]=true;
            backing(candidates,target,i+1);
            //回溯
   	        paths.remove(paths.size()-1);
            sum-=candidates[i];
            isUsed[i]=false;
        }
    }

在这里插入图片描述

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

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

相关文章

Linux软件包管理器yum—5

一、Linux下软件安装的方式 ①源代码安装&#xff1a; ②rmp包安装&#xff1a; 本质是拷贝可执行程序到系统目录下。 ③yum一键下载&#xff0c;安装&#xff0c;卸载。相当于手机的应用商店。 二、yum 2.1查看yum已配置的源&#xff1a; ls /etc/yum.repos.d/ 2.2查看yum…

Nexus 启动异常

在迁移 Nexus 到新的服务器上&#xff0c;我们有下面的异常。 [rootdevops log]# /opt/nexus/bin/nexus start No suitable Java Virtual Machine could be found on your system. The version of the JVM must be 1.8. Please define INSTALL4J_JAVA_HOME to point to a suita…

springboot数字化智慧城市管理系统源码

目录 ​系统开发环境 系统功能模块 系统特点 1、智慧城管移动端 2、案件受理 3、AI视频智识别分析 系统应用价值 1、提升案件办理效率 2、提升监管效能 3、提升行政执法水平 4、推进行政执法创新 智慧城管综合执法办案系统功能 现场移动执法 一般程序案件的网上办…

5.3 mybatis之autoMappingUnknownColumnBehavior作用

文章目录 1. NONE2. WARNING3. FAILING autoMappingUnknownColumnBehavior是< settings >配置下的属性&#xff0c;该属性是指定发现自动映射目标未知列&#xff08;或未知属性类型&#xff09;的行为。就是说当数据库中的字段找不到映射java对象的属性或者与java对象对应…

MQ概览及Kafka详解

文章目录 概览MQ优点MQ缺点常见MQ对比JMS消息模型点对点模式发布订阅模式 kafka基础架构发布订阅工作流程生产者生产者文件存储生产者分区策略生产者数据可靠性保证生产者数据一致性保证生产者ack机制ExactlyOnce生产者发送消息流程 消费者消费者分区分配策略消费者消费数据问题…

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64)

MATLAB 自定义实现点云法向量和曲率计算(详细解读)(64) 一、算法介绍二、算法步骤三、算法实现1.代码 (完整,注释清晰,可直接用)2.结果一、算法介绍 首先说明: ------这里代码手动实现,不调用matlab提供的法向量计算接口,更有助于大家了解法向量和曲率的计算方法,…

Docker 学习笔记(八):Dockerfile实战篇,制作 Tomcat 镜像,发布镜像到 DockerHub 和阿里云

一、前言 记录时间 [2024-4-13] 系列文章简摘&#xff1a; Docker 学习笔记&#xff08;六&#xff09;&#xff1a;挑战容器数据卷技术一文通&#xff0c;实战多个 MySQL 数据同步&#xff0c;能懂会用&#xff0c;初学必备 Docker 学习笔记&#xff08;七&#xff09;&#x…

数据结构——基于单链表实现通讯管理系统

文章目录 一、前言SList.hSList.c 二、通讯录的实现通讯录项目Contact.h载入数据初始化通讯录添加通讯录数据通过姓名查找联系人删除通讯录数据展示通讯录数据查找通讯录数据修改通讯录数据保存通讯录销毁通讯录数据 三、所有源代码Contact.hContact.cSList.hSList.ctest.c 一、…

Sonar+postsql的安装配置,centos7.9系统

1.安装postsql15 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-6-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql15-server sudo service postgresql-15 initdb sudo chkconfig postgresql-15 on sudo servic…

[StartingPoint][Tier2]Included

LXD https://www.hackingarticles.in/lxd-privilege-escalation/ Task 1 What service is running on the target machine over UDP? &#xff08;目标机器上通过UDP运行的服务是什么&#xff1f;&#xff09; $ nmap -sU 10.129.232.86 -p 69 tftp Task 2 What class o…

每日一博 - 重新定义JAR中的类或方法

文章目录 概述方式一 &#xff1a; 项目覆写相同包结构的类方式二&#xff1a; 魔改Jar包中的类方案对比方案一&#xff1a;在项目中新增第三方包路径方案二&#xff1a;替换JAR包中的类文件 概述 在一些情况下&#xff0c;我们可能需要定制第三方库的行为&#xff0c;但却无法…

部署HDFS集群(完全分布式模式、hadoop用户控制集群、hadoop-3.3.4+安装包)

目录 前置 一、上传&解压 &#xff08;一 &#xff09;上传 &#xff08;二&#xff09;解压 二、修改配置文件 &#xff08;一&#xff09;配置workers文件 &#xff08;二&#xff09;配置hadoop-env.sh文件 &#xff08;三&#xff09;配置core-site.xml文件 &…

人工智能|机器学习——基于机器学习的信用卡办卡意愿模型预测项目

一、背景介绍 在金融领域&#xff0c;了解客户的信用卡办卡意愿对于银行和金融机构至关重要。借助机器学习技术&#xff0c;我们可以根据客户的历史数据和行为模式预测其是否有办理信用卡的倾向。本项目通过Python中的机器学习库&#xff0c;构建了两个常用的分类模型&#xff…

自定义创建真实项目vue2项目

1. 创建 vue create 项目名 2. 选择自定义 3. 勾选以下必备选项 4.选择使用vue2 5. 选择哈希模式&#xff08;n&#xff09;; css选择Less 6. ESLint校验 选择 7. 保存&#xff08;按照默认&#xff09; 8. 在哪里添加ESLint文件 9. 要不要把这个改成将来的预设&am…

底层开发必知的三个内存结构概念

大家好&#xff0c;今天给大家介绍底层开发必知的三个内存结构概念&#xff0c;文章末尾附有分享大家一个资料包&#xff0c;差不多150多G。里面学习内容、面经、项目都比较新也比较全&#xff01;可进群免费领取。 在底层开发中&#xff0c;以下是三个关键的内存结构概念&…

linux进阶篇:性能监控工具——vmstat命令详细讲解

Linux性能监控工具&#xff1a;vmstat命令详细讲解 vmstat是Virtual Meomory Statistics&#xff08;虚拟内存统计&#xff09;的缩写&#xff0c;可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计&#xff0c;不足之处是无法对某个进程进行深入分析…

【Godot4.2】CanvasItem绘图函数全解析 - 7.自定义节点TextBoard

概述 之前发布的几篇文章几乎阐述了CanvasItem绘图函数最基础的内容。 本篇结合draw_style_box()和TextParagraph类&#xff0c;自定义了一个可以自适应宽高显示多行文本&#xff0c;且带有一个样式盒作为背景的文字板节点TextBoard。 系列目录 0.概述1.绘制简单图形2.设定绘…

13 Php学习:面向对象

PHP 面向对象 面向对象&#xff08;Object-Oriented&#xff0c;简称 OO&#xff09;是一种编程思想和方法&#xff0c;它将程序中的数据和操作数据的方法封装在一起&#xff0c;形成"对象"&#xff0c;并通过对象之间的交互和消息传递来完成程序的功能。面向对象编…

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现基于迁移学习和GASF-CNN-Mutilhead-Attention格拉姆角场和卷积网络多头注意力机制多特征分类预测/故障识别分类效果基…

卷积神经网络(CNN)笔记——多图深入理解

梗直哥、梗直哥丶的个人空间-梗直哥丶个人主页-哔哩哔哩视频 过去十年,卷积神经网络(CNN)如同科技领域的明星,以其卓越的表现撑起了人工智能的半边天。这种创新的网络模型,不仅在计算机视觉、语音识别等传统领域大放异彩,更为人工智能的快速发展和广泛应用奠定了坚实的基础。…