代码随想录第27天| 39. 组合总和

39. 组合总和 

39. 组合总和 - 力扣(LeetCode)

代码随想录 (programmercarl.com)

带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= candidates.length <= 30
  • 2 <= candidates[i] <= 40
  • candidates 的所有元素 互不相同
  • 1 <= target <= 40

 第一反应这个题和昨天的相差不大,还是用回溯法,只不过target中的数字可以重复使用。那这一条件的改变会影响哪里呢?自己画了图:

回溯算法模板:

void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {处理节点;backtracking(路径,选择列表); // 递归回溯,撤销处理结果}
}

回溯三部曲:

1、确定参数: 定义一个二位数组result存放结果集,一个path存放符合条件的结果。

public void backtracking(List<List<Integer>> res, List<Integer> path, int[] candidates, int target, int sum, int idx) {}

2、确定终止条件:从上图中可以看到,sum>target或者sum=target的时候终止,sum=target时还要把path返回结果集

if(sum > target){return;
}
if (sum == target) {res.add(new ArrayList<>(path));return;
}

3、确定单层遍历逻辑:

for (int i = startIndex; i < candidates.length; i++) {sum += candidates[i];path.add(candidates[i]);backtracking(candidates, target, sum, i); // 不用 i+1 了,表示可以重复读取当前的数sum -= candidates[i];path.remove(path.size() - 1);
}

剪枝操作

在进行操作前,先对总组合进行排序,排序之后,如果下一层的sum(也就是本层的sum+candidate[i])>target,就可以结束本层遍历的for循环。那剪枝就需要在for循环的条件上做文章:

// 剪枝优化
class Solution {public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> res = new ArrayList<>(); // 初始化结果列表Arrays.sort(candidates); // 将候选数组排序,以便剪枝和提高搜索效率backtracking(res, new ArrayList<>(), candidates, target, 0, 0); // 调用回溯函数进行组合求和return res; // 返回结果列表}public void backtracking(List<List<Integer>> res, List<Integer> path, int[] candidates, int target, int sum, int idx) {// 如果当前的和等于目标值,将当前路径加入结果列表中,表示找到了一组满足条件的组合if (sum == target) {res.add(new ArrayList<>(path));return;}for (int i = idx; i < candidates.length; i++) {// 如果当前和加上当前候选数超过了目标值,则终止当前循环,因为之后的候选数只会更大if (sum + candidates[i] > target) break;path.add(candidates[i]); // 将当前候选数添加到路径中// 递归调用回溯函数,在新的路径上继续搜索backtracking(res, path, candidates, target, sum + candidates[i], i);path.remove(path.size() - 1); // 回溯,移除路径 path 最后一个元素,以便尝试其他组合}}
}

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

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

相关文章

思考:开启MMU瞬间可能出现的多种问题以及多种解决方案

快速链接: 【精选】ARMv8/ARMv9架构入门到精通-[目录] &#x1f448;&#x1f448;&#x1f448; (说明本文的介绍都是基于armv8-aarch64或armv9硬件架构) 在mmu未开启阶段&#xff0c;PC操作的都是物理地址执行程序&#xff0c;这样看起来一切正常&#xff0c;没啥问题。 例如…

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器

Windows Server 2022 使用ApacheDS用户远程桌面登录服务器 1、接上篇 Windows Server 2022 使用ApacheDS用户认证 使用Administrator用户远程登录192.168.1.100windows server&#xff0c;打开pGina软件 2、输入刚刚在ApacheDS中的新添加的用户测试一下&#xff0c;会自动添加…

嵌入式Linux:fcntl()和ioctl()函数

目录 1、fcntl()函数 2、ioctl()函数 fcntl()和ioctl()是用于对文件描述符进行控制的两个系统调用&#xff0c;它们在不同的情况下有不同的用途和功能。 1、fcntl()函数 fcntl()函数提供了对已打开文件描述符执行各种控制操作的功能&#xff0c;例如复制文件描述符&#xf…

汽车电子行业知识:什么是车联网V2X技术

文章目录 一、V2X是什么?二、V2X功能有哪些?三、V2X的发展现状四、V2X包含哪些技术?五、V2X与哪些领域相关?六、V2X的未来趋势七、有哪些研发V2X技术的公司八、V2X技术应用的困境九、V2X技术应用的需求 自动驾驶、汽车互联等新一代信息技术和汽车产业融合发展已经成为…

如何在极狐GitLab 配置 邮件功能

本文作者&#xff1a;徐晓伟 GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 本文主要讲述了在极狐GitLab 用户…

【带你了解下前端开发语言有那些】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

爱上数据结构:二叉树的基本概念

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;数据结构 ​ 一、树的基本概念 1.概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因 为它看起…

计算机网络数据链路层知识总结

物理层知识总结传送门 计算机网络物理层知识点总结-CSDN博客 功能 功能概述 一些基本概念 结点:主机、路由器链路﹔网络中两个结点之间的物理通道&#xff0c;链路的传输介质主要有双绞线、光纤和微波。分为有线链路、无线链路。数据链路︰网络中两个结点之间的逻辑通道&a…

Prometheus+grafana环境搭建rabbitmq(docker+二进制两种方式安装)(二)

搭建完Prometheusgrafana基础环境后参见&#xff1a;Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客&#xff0c;对我本地的一些常用法人服务进行一个监控。基本都可以根据官方文档完成搭建&#xff0c;因为docker和二进制方式安装各有优缺点。 d…

隐私计算实训营学习七:隐语SCQL的架构详细拆解

文章目录 一、SCQL Overview1.1 SCQL背景1.2 SCQL Overview 二、SCQL CCL三、SCQL架构 一、SCQL Overview 1.1 SCQL背景 SCQL&#xff1a;属于隐私计算BI范畴&#xff0c;允许多个互不信任参与方在不泄露各自隐私数据的条件下进行联合数据分析。 如下数据在不同机构&#xf…

Unity 学习日记 12.小球撞击冰块游戏

目录 1.准备场景 2.让小球动起来 3.用鼠标把小球甩出去 4.加入鼠标点击小球的判断 5.小球与冰块的碰撞测试 6.撞击后销毁冰块 ​编辑 7.显示游戏计时 8.显示扔球次数 9.显示剩余冰块个数 10.游戏结束 11.完整代码 下载源码 UnityPackage 最终效果&#xff1a; 1.准…

基于springboot+vue实现的房源出租信息系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】&#xff1a;Java 【框架】&#xff1a;spring…

ElementUI响应式Layout布局xs,sm,md,lg,xl

响应式布局 参照了 Bootstrap 的 响应式设计&#xff0c;预设了五个响应尺寸&#xff1a;xs、sm、md、lg 和 xl。 <el-row :gutter"10"><el-col :xs"8" :sm"6" :md"4" :lg"3" :xl"1"><div class…

HQL,SQL刷题,尚硅谷(初级)

目录 相关表数据&#xff1a; 题目及思路解析&#xff1a; 多表连接 1、课程编号为"01"且课程分数小于60&#xff0c;按分数降序排列的学生信息 2、查询所有课程成绩在70分以上 的学生的姓名、课程名称和分数&#xff0c;按分数升序排列 3、查询该学生不同课程的成绩…

网络中的网络(NiN)

文章目录 NiN块 NiN块 NiN的想法是在每个像素位置&#xff08;针对每个高度和宽度&#xff09;应用一个全连接层。果我们将权重连接到每个空间位置&#xff0c;我们可以将其视为1x1卷积层&#xff0c;或作为在每个像素位置上独立作用的全连接层。 从另一个角度看&#xff0c;即…

Java language programming:身体质量指数(BMI)测算

题目&#xff1a; 体重是反映和衡量一个人健康状况的重要标志之一&#xff0c;过胖和过瘦都不利于健康&#xff0c;BMI&#xff08;身体质量指数&#xff09;计算方法&#xff1a;体重&#xff08;以千克为单位&#xff09;除以身高&#xff08;以米为单位&#xff09;的平方。…

ollama本地部署大模型(纯CPU推理)实践

文章目录 说明Ollama和Ollama WebUI简介Ollama模型硬件要求内存要求 Ollama容器部署Ollama容器内模型下载和对话Ollama WebUI部署Ollama WebUI下载模型和对话轻量模型推荐机器硬件信息概览qwen:0.5b推理体验gemma:7b推理体验 说明 本文旨在分享在linux(centos8)平台使用docker…

几种储存数据的方式

几种储存数据的方式 数组&#xff08;Array&#xff09;&#xff1a;数组是一种最基本的数据结构&#xff0c;用于存储固定大小的相同类型元素的连续内存空间。数组具有固定长度&#xff0c;一旦创建后长度不能更改。 声明数组&#xff1a; // 声明一个整数数组 int[] intArray…

新生报到系统的设计与实现(论文+源码)_kaic

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对新生报到信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

3.29号系统移植

1. uboot介绍 bootloader&#xff1a;引导加载程序的统称 uboot是引导加载程序中的一种 1.1 uboot特点 uboot是一个开源分布式软件uboot是由德国DNEX小组进行维护uboot支持多种硬件架构平台uboot是一个裸机开发程序uboot占用体积小uboot主要作用引导linux内核进行启动&#…