算法:回溯三 Combination Sum组合总数
说明
题目地址:https://leetcode.com/problems/combination-sum/
Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
The same repeated number may be chosen from candidates unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [2,3,6,7], target = 7,
A solution set is:
[[7],[2,2,3]
]
Example 2:
Input: candidates = [2,3,5], target = 8,
A solution set is:
[[2,2,2,2],[2,3,3],[3,5]
]
解法
思路:对candidate数组进行排序,对candidate中的每个元素可以选择加,也可以选择不加;可以选择重复,也可以选择不重复。这里不仅要用到回溯,也要用到for循环。两个判断条件:
target == 0
则把列表添加到结果列表中,注意这个列表用clone,如果用索引list,结果会被修改掉。resultList.add(new ArrayList<>(list))
target > 0
则判断是否要加入当前元素。
package backtracking;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;// https://leetcode.com/problems/combination-sum/
public class CombinationSum {public static void main(String[] args) {CombinationSum obj = new CombinationSum();int[] candicates = {2, 3, 6, 7};int target = 7;List<List<Integer>> resultList = obj.combinationSum(candicates, target);System.out.println(Arrays.toString(resultList.toArray()));}public List<List<Integer>> combinationSum(int[] candidates, int target) {List<List<Integer>> resultList = new ArrayList<>();Arrays.sort(candidates);recursive(candidates, target, 0, new ArrayList<>(), resultList);return resultList;}public void recursive(int[] candidates, int target, int start, List<Integer> list, List<List<Integer>> resultList) {if (target > 0) {for (int i = start; i < candidates.length && target >= candidates[i]; i++) {list.add(candidates[i]);recursive(candidates, target - candidates[i], i, list, resultList);list.remove(list.size() - 1);}} else if (target == 0) {resultList.add(new ArrayList<>(list));}}
}
代码下载
https://github.com/zgpeace/awesome-java-leetcode/blob/master/code/LeetCode/src/backtracking/CombinationSum.java
算法:回溯三 Combination Sum组合总数相关推荐
- 递归/回溯:Combination Sum II数组之和
问题如下: 已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子 集中的各个元素和为整数target的子集,结果中无重复的子集. 例如: nums[] = [10, 1, 2, 7, 6, ...
- 39. Combination Sum 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- Leetcode39.Combination Sum组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- 40. Combination Sum II 组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...
- Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水
维护公众号:bigsai ,回复进群加入打卡,回复bigsai分享一些学习资源! 上周第一次 LeetCode 36有效的数独&37解数独(八皇后问题) 上周第二次 LeetCode 38外观 ...
- 36 数字组合(Combination Sum)
文章目录 1 题目 2 解决方案 2.1 思路 2.2 图解 2.3 时间复杂度 2.4 空间复杂度 3 源码 1 题目 题目:数字组合(Combination Sum) 描述:给定一个候选数字的集合 ...
- C语言经典回溯算法之解决数的组合问题(详解)
文章目录 一.回溯算法 二.数的组合问题 一.回溯算法 1.回溯法 也叫试探法,实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯&q ...
- 【LeetCode】#39组合总和(Combination Sum)
[LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...
- 高级数据结构与算法 | 回溯算法(Back Tracking Method)
文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...
- 理解回溯算法——回溯算法的初学者指南
0 前言 最近做了不少关于回溯法的算法题,积累了一些心得,这篇博文算是对回溯法的一个小总结. 1 回溯法简介 回溯法简单来说就是按照深度优先的顺序,穷举所有可能性的算法,但是回溯算法比暴力穷举法更高明 ...
最新文章
- linux系统中使用chattr命令的,chattr命令怎么用
- linux下 open() write() read() close函数
- hdu 1698(线段树区间更新)
- 201124阶段二sqlite3 API
- TPT:中科院等提出用于VideoQA的跨模态交互时间金字塔Transformer
- Linux嵌入式系统开发之Led开发——应用篇(一)
- 小数保留4位_实验结果保留几位有效数字?
- Druid【部署 01】最新版本的(安装+启动服务+打开控制台+本地文件数据载入+数据查询)及(小内存服务器启动JVM参数调整)一次学会使用Druid的完整流程(已完成)
- MFC 多线程编程总结
- 火狐浏览器怎么打开oracle,firefox火狐浏览器点击没响应,该怎么解决?
- 【kali-漏洞利用】(3.4)免杀Payload 生成工具(下):Veil后门使用、监听失败原因
- IMAGE-GUIDED NEURAL OBJECT RENDERING
- 如何快速入门并轻松简单的学习Linux?
- 计算1+3+5+...+99 的和
- 一起来分解一个Netty应用
- 微信小程序云开发学习
- win7 64下RegOpenKeyEx返回的值不正确(转)
- 1.10、Java面经 内容太杂不详细 没用
- Java中怎么移动文件_使用java移动文件
- 再见,Eclipse !
热门文章
- linux命令行改变时区,Linux命令行操作修改系统时区
- bzoj3550: [ONTAK2010]Vacation(单纯形法+线性规划)
- 指针的意义和linux的内存回收艺术
- CSS学习笔记:transition
- 异步下载图片+图片缓存
- 拉式工序不允许倒冲财务仓
- 解决PowerDesigner 错误:Invalid repository user or password!
- 看mysql手册中模式(SQL_MODE)学到的知识
- ajax实现form表单提交
- 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法