说明

题目地址: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循环。两个判断条件:

  1. target == 0 则把列表添加到结果列表中,注意这个列表用clone,如果用索引list,结果会被修改掉。resultList.add(new ArrayList<>(list))
  2. 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组合总数相关推荐

  1. 递归/回溯:Combination Sum II数组之和

    问题如下: 已知一组数(其中有重复元素),求这组数可以组成的所有子集中,子 集中的各个元素和为整数target的子集,结果中无重复的子集. 例如: nums[] = [10, 1, 2, 7, 6, ...

  2. 39. Combination Sum 组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  3. Leetcode39.Combination Sum组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...

  4. 40. Combination Sum II 组合总和 II

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  5. Leetcode 40组合总数(回溯)Ⅱ41缺失的第一个正数42接雨水

    维护公众号:bigsai ,回复进群加入打卡,回复bigsai分享一些学习资源! 上周第一次 LeetCode 36有效的数独&37解数独(八皇后问题) 上周第二次 LeetCode 38外观 ...

  6. 36 数字组合(Combination Sum)

    文章目录 1 题目 2 解决方案 2.1 思路 2.2 图解 2.3 时间复杂度 2.4 空间复杂度 3 源码 1 题目 题目:数字组合(Combination Sum) 描述:给定一个候选数字的集合 ...

  7. C语言经典回溯算法之解决数的组合问题(详解)

    文章目录 一.回溯算法 二.数的组合问题 一.回溯算法 1.回溯法 也叫试探法,实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就"回溯&q ...

  8. 【LeetCode】#39组合总和(Combination Sum)

    [LeetCode]#39组合总和(Combination Sum) 加粗样式 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数 ...

  9. 高级数据结构与算法 | 回溯算法(Back Tracking Method)

    文章目录 回溯 电话号码的字母组合 二进制手表 组合总数 全排列 活字印刷 N皇后 N皇后II 回溯 回溯是一种通过穷举所有可能情况来找到所有解的算法.如果一个候选解最后被发现并不是可行解,回溯算法会 ...

  10. 理解回溯算法——回溯算法的初学者指南

    0 前言 最近做了不少关于回溯法的算法题,积累了一些心得,这篇博文算是对回溯法的一个小总结. 1 回溯法简介 回溯法简单来说就是按照深度优先的顺序,穷举所有可能性的算法,但是回溯算法比暴力穷举法更高明 ...

最新文章

  1. linux系统中使用chattr命令的,chattr命令怎么用
  2. linux下 open() write() read() close函数
  3. hdu 1698(线段树区间更新)
  4. 201124阶段二sqlite3 API
  5. TPT:中科院等提出用于VideoQA的跨模态交互时间金字塔Transformer
  6. Linux嵌入式系统开发之Led开发——应用篇(一)
  7. 小数保留4位_实验结果保留几位有效数字?
  8. Druid【部署 01】最新版本的(安装+启动服务+打开控制台+本地文件数据载入+数据查询)及(小内存服务器启动JVM参数调整)一次学会使用Druid的完整流程(已完成)
  9. MFC 多线程编程总结
  10. 火狐浏览器怎么打开oracle,firefox火狐浏览器点击没响应,该怎么解决?
  11. 【kali-漏洞利用】(3.4)免杀Payload 生成工具(下):Veil后门使用、监听失败原因
  12. IMAGE-GUIDED NEURAL OBJECT RENDERING
  13. 如何快速入门并轻松简单的学习Linux?
  14. 计算1+3+5+...+99 的和
  15. 一起来分解一个Netty应用
  16. 微信小程序云开发学习
  17. win7 64下RegOpenKeyEx返回的值不正确(转)
  18. 1.10、Java面经 内容太杂不详细 没用
  19. Java中怎么移动文件_使用java移动文件
  20. 再见,Eclipse !

热门文章

  1. linux命令行改变时区,Linux命令行操作修改系统时区
  2. bzoj3550: [ONTAK2010]Vacation(单纯形法+线性规划)
  3. 指针的意义和linux的内存回收艺术
  4. CSS学习笔记:transition
  5. 异步下载图片+图片缓存
  6. 拉式工序不允许倒冲财务仓
  7. 解决PowerDesigner 错误:Invalid repository user or password!
  8. 看mysql手册中模式(SQL_MODE)学到的知识
  9. ajax实现form表单提交
  10. 'mysql' 不是内部或外部命令,也不是可运行的程序或批处理文件的解决办法