leetcode39. 组合总和(回溯算法-java)

news2024/11/16 17:31:14

组合总和

  • leetcode39. 组合总和
    • 题目描述
    • 解题思路
    • 代码演示
  • 回溯算法专题

leetcode39. 组合总和

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/combination-sum

题目描述

给你一个 无重复元素 的整数数组 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。
先看下子集的代码。我们在子集代码上做改造就可以了。

 public void backtrack(int[] nums, int start) {

      res.add(new LinkedList<>(track));
      for(int i = start;i < nums.length;i++){
      		//做出的选择
          track.addLast(nums[i]);
          //做出选择后,去下一个位置去继续做选择
          backtrack(nums,i + 1);
          //撤销选择,上一次递归完成后,撤销选择,继续进行下一次递归
          track.removeLast();
      }
    }

在代码里,我们做出选择后,递归里 i + 1,我们去下一个位置去选择了,保证了,元素不重复,这个题目里,元素可以重复选择,因此,我们递归时,不传i + 1,传i 让他可以继续在这个位置上做出选择,这就解决了第一个问题,
第二个问题,和为target,我们递归时带上这个target,每次选择一个数时,target 减去这个数,那么target == 0 时,代表目标和满足要求,停止选择就行了。
以上两个问题都解决了,下面代码演示下。

代码演示

class Solution {
    List<List<Integer>> ans = new ArrayList<>();
    LinkedList<Integer> board = new LinkedList<>();
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        process(candidates,target,0);
        return ans;
    }
	/**
	*回溯算法
	*index 递归到的下标 位置
	*/
    public void process(int[]candidates,int target,int index){
    	//base case target < 0 表示前面的选择不符合要求,直接返回
        if(target < 0){
            return;
        }
        //下标越界时,target 还没满足要求,直接返回 (这个判断可以不要,越界时下面代码自然会停)
         if(index == candidates.length && target != 0){
            return;
        }
        // 满足要求时,加到答案里,
        if(target == 0){
            ans.add(new LinkedList<>(board));
            return;
        }
       //选择列表
        for(int i = index;i < candidates.length;i++){
        	//做出选择
            board.addLast(candidates[i]);
            //递归时 还传 i,元素可以重复选,让他继续在当前元素做选择
            process(candidates,target - candidates[i],i);
            //撤销选择
            board.removeLast();
        }
    }
}

回溯算法专题

leetcode78 子集

leetcode77. 组合

leetcode40. 组合总和 II

leetcode90. 子集 II

leetcode216. 组合总和 III

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

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

相关文章

浏览器跨域限制:为什么浏览器不能跨域发送Ajax请求?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是跨域请求&am…

什么是虚拟展厅?教您快速打造一个3D元宇宙虚拟展厅

引言&#xff1a; 在如今的数字化时代&#xff0c;虚拟展厅和3D元宇宙成为了展示和推广产品、品牌以及创意的新兴方式。虚拟展厅为企业带来了无限的可能性&#xff0c;如何快速打造一个3D元宇宙虚拟展厅成了许多企业想了解的。 一&#xff0e;虚拟展厅的魅力 1.什么是虚拟展厅…

BUUCTF刷题十一道(07)

文章目录 [Zer0pts2020]Can you guess it?[CISCN2019 华北赛区 Day1 Web2]ikun[GWCTF 2019]枯燥的抽奖[WUSTCTF2020]CV Maker[NCTF2019]True XML cookbook[RCTF2015]EasySQL[CISCN2019 华北赛区 Day1 Web1]Dropbox[CISCN2019 华北赛区 Day1 Web5]CyberPunk[红明谷CTF 2021]wri…

防汛四级应急响应启动,尾矿库如何安全度过汛期?

国家防总办公室向上海、江苏、浙江、安徽、江西、河南、湖北、湖南、广西、重庆、四川、贵州、云南等省份防指下发通知&#xff0c;要求全面压实以地方行政首长负责制为核心的各项防汛责任&#xff0c;加强精准监测预报和会商研判&#xff0c;落实好“叫应”机制&#xff0c;确…

我把一句话需求交给AI,它竟然给我返回了……

&#x1f449;腾小云导读 也许你经历过这种情况&#xff1a;产品和设计同学用一句话就把需求说完了&#xff0c;你抓破脑袋做出来的版本又达不到他们的要求。不如尝试让 AI 承担痛苦&#xff0c;让它理解、拆解并实现一句话需求&#xff1f;本篇作者尝试提出一个自动配置可视化…

踩坑:Vue3 中的watch监视属性

文章目录 一、问题一&#xff1a;reactive 定义的响应式数据无 oldValue问题分析解决 二、问题二&#xff1a;watch默认开启了深度监视且无法关闭问题分析解决 一、问题一&#xff1a;reactive 定义的响应式数据无 oldValue 问题 监视 reactive 所定义的一个响应式数据&#…

linux安装git步骤;基于yum、dnf、源码安装【非常详细】

这里写目录标题 一 dnf安装二 yum安装三 源码安装1 基于 RPM 的发行版&#xff08;Fedora/RHEL/RHEL衍生版&#xff09;2 基于 Debian 的发行版&#xff08;Debian/Ubuntu/Ubuntu-derivatives&#xff09;3 yum软件包管理器来安装&#xff0c;这个一般是CnetOS Stream 8以前的版…

POLARDB IMCI 白皮书 云原生HTAP 数据库系统 一 与其他的商业数据库在HTAP的异同点(译)...

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

​关于 O2OA (翱途) 软件商用许可证授权形式的调整​

尊敬的小伙伴们&#xff1a; 非常感谢您对 O2OA 开发平台的关注与支持&#xff01; 兰德网络 O2OA 平台软件商用许证授权形式正式由 “按年授权” 改为 “按版本买断” 的永久许可形式。 这意味着&#xff0c;合作伙伴在持有特定版本的软件商用许可后&#xff0c;将能够永久…

《Python精选300题》

专栏简介 Python 是一门功能强大的编程语言&#xff0c;已经成为了数据科学、机器学习、Web 开发等领域的首选语言之一。因此&#xff0c;掌握 Python 的相关知识点对于学习和使用这门语言至关重要。 本专栏中&#xff0c;精选了 300 道题目&#xff0c;囊括了 Python 入门阶段…

什么是链表?

链表 什么是链表&#xff1f; 链表是有序的数据结构&#xff0c;链表中的每个部分称为节点。可以首、尾、中间进行数据存取&#xff0c;链表的元素在内存中不必是连续的空间&#xff0c;每个节点通过 next 指针指向下一个节点。 优点 链表的添加和删除不会导致其余元素位移。…

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗&#xff1f;如果能&#xff0c;如何实现&#xff1f; 答案2023-06-21&#xff1a; java的&#xff1a; 这个问题&#xff0c;我问了一些人&#xff0c;部分人是回答得有问题的。synchronized这是个关键字&…

23---WPF数据库ORM框架

一、仓库--存放货物---数据库--存放数据--关系型数据/非关系型数据库 1.关系型数据:保存数据保存关系--SqlServer&#xff0c;MySql&#xff0c;Oracle 2.非关系型数据&#xff1a;保存数据---Redis,Mongo,Memecahe 二、关系型数据和非关系型数据的区别&#xff1a; 1.关系…

高效底座模型LLaMA

论文标题&#xff1a;LLaMA: Open and Efficient Foundation Language Models 论文链接&#xff1a;https://arxiv.org/abs/2302.13971 论文来源&#xff1a;Meta AI 一、概述 大型语言模型&#xff08;Large Languages Models&#xff0c;LLMs&#xff09;通过大规模文本数据的…

Selenium 环境配置

如果你做过 Web 测试的工作&#xff0c;那么你应该明白 Web 测试中最重要的一部分工作就是自动化测试。自动化测试&#xff0c;顾名思义就是让浏览器自动运行&#xff0c;而无需手动操作。这和我们爬虫工作原理有些相似&#xff0c;我们爬虫也需要让浏览器运行网址来获取我们需…

HTTPS加密

目录 HTTPS加密1.加密和解密2.对称加密3.非对称加密4.中间人攻击5.证书 HTTPS加密 1.加密和解密 1.明文: 要传递的原始信息。 2.密文: 经过加密后的信息。 3.加密就是指将明文&#xff08;要传输的信息&#xff09;按照指定的方式进行变换&#xff0c;生成密文。 4.解密…

Pytest+selenium+allure+Jenkins自动化测试框架搭建及使用

一、 环境搭建 1. Python下载及安装 Python可应用于多平台包括windows, Linux 和 Mac OS X, 本文主要介绍windows环境下。你可以通过终端窗口输入 "python" 命令来查看本地是否已经安装Python以及Python的安装版本。 如未安装python, 推荐下载python 3.8.3以…

Android——事务处理(续)(十三)

1. 长按事件 1.1 知识点 &#xff08;1&#xff09;掌握长按事件的操作形式&#xff1b; &#xff08;2&#xff09;可以设置手机的桌面背景&#xff1b; 1.2 具体内容 范例&#xff1a;长按一张图片之后&#xff0c;此图片设置为手机桌面背景。 <LinearLayout xmlns:a…

LocalDateTime 和 LocalDate 与 date 有什么区别;LocalDateTime 示例,LocalDate 示例

目录 1 LocalDateTime 和 LocalDate 与 date 有什么区别2 LocalDateTime 示例&#xff1a;2 LocalDate 示例&#xff1a; 1 LocalDateTime 和 LocalDate 与 date 有什么区别 LocalDateTime、LocalDate和Date是 Java中不同的类库中用于表示日期和时间的类&#xff0c; 它们在功…

「Java核心技术大会 2023」6月重磅启动,邀你共同探讨Java生态

前言 &#x1f4d5;作者简介&#xff1a;热爱跑步的恒川&#xff0c;致力于C/C、Java、Python等多编程语言&#xff0c;热爱跑步&#xff0c;喜爱音乐的一位博主。 &#x1f4d7;本文收录于恒川的日常汇报系列&#xff0c;大家有兴趣的可以看一看 &#x1f4d8;相关专栏C语言初…