LeetCode 39 组合总和

题目描述

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

说明

所有数字(包括 target)都是正整数。解集不能包含重复的组合。

示例

输入: candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]输入: candidates = [2,3,5], target = 8,
所求解集为:
[
[2,2,2,2],
[2,3,3],
[3,5]]输入: candidates = [2,3], target = 5,
所求解集为:
[
[2,3]
]

题目解析

要求得出所有和为目标值的组合,那么这样使用回溯法将所有结果遍历一边是非常合适的。

数组中所有元素都是可以重复使用的,那么也就是说每次都可以从第一位开始,但是最终结果中不允许包括重复的组合,那么应该怎样解决呢,那就要将每组数据的第一个值的索引传递进去,每一次都是从这个位置开始判断,那么就可以避免将之前的元素重复使用了。

回溯法

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

代码实现

最难的地方应该是回溯点的确定和递归的使用

/*** @description:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。* @author: cuiyang* @date: 2020/5/19 10:53*/
// 39. 组合总和
// https://leetcode-cn.com/problems/combination-sum
// 时间复杂度:O(n)
// 空间复杂度:O(n)
public class Solution {//全局变量,保存结果集static List<List<Integer>> result = new ArrayList<>();public static List<List<Integer>> combinationSum(int[] candidates, int target) {Arrays.sort(candidates);//排序之后,进行数组循环,从前向后依次进行组合,调用dfs方法for (int i = 0; i < candidates.length; i++) {//单个结果ListArrayList<Integer> resultList = new ArrayList<>();resultList.add(candidates[i]);dfs(candidates, target, candidates[i], resultList, i);}return result;}/*** 给定数组,目标值,和,单个结果集,计算开始位置** @param candidates* @param target* @param val* @param r* @param j*/private static void dfs(int[] candidates, int target, int val, List<Integer> r, int j) {//回溯点if (target == val) {result.add(new ArrayList<>(r));return;}//回溯点if (val > target) {return;}for (int i = j; i < candidates.length; i++) {//数字可重复使用,所有从当前最小的开始累加r.add(candidates[i]);val += candidates[i];//此处未回溯时i始终不变,相当于重复加同一个数dfs(candidates, target, val, r, i);//r退一步,退到上一步的状态继续执行r.remove(r.size() - 1);val -= candidates[i];}}public static void main(String[] args) {List<List<Integer>> lists = combinationSum(new int[]{2, 3, 6, 7}, 7);lists.forEach(l->{System.out.println(l.toString());});}
}

步骤解析


此处将一小部分的步骤写出,初次写算法类文章,多多指教。

LeetCode 39 组合总和相关推荐

  1. leetcode 39. 组合总和 40. 组合总和 II

    leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...

  2. LeetCode 39. 组合总和(排列组合 回溯)

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

  3. leetcode - 39. 组合总和

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

  4. leetcode 39. 组合总和

    执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户 内存消耗:10.5 MB, 在所有 C++ 提交中提交中击败了90.06%的用户 给你一个无重复元素的整数数组 candidate ...

  5. Leetcode 39 组合总和 (每日一题 20210806)

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

  6. leetcode 39. 组合总和 思考分析

    目录 1.题目 2.思考分析 3.未经优化代码 4.剪枝优化 1.题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...

  7. leetcode —— 39. 组合总和

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

  8. LeetCode 39. 组合总和(回溯+剪枝)

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

  9. LeetCode 39:组合总和(Javascript 解答)

    原题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回 ...

最新文章

  1. edit怎么读英语_名师说学习:英语学习有方法
  2. 程序员如何避免“滴滴式裁员”悲剧?
  3. java string与integer_Java中Integer和String浅谈
  4. 12月第1周全球五大顶级域名总量呈负增长 减2.5万个
  5. 历时3年,清华大学iDLab实验室打造《强化学习和控制》课程及讲义!
  6. boost智能指针之shared_ptr,scoped_ptr,intrusive_ptr,weak_ptr源码简析
  7. [linux]unixODBC的安装配置说明
  8. 常用Sqlserver中的查询语句
  9. web.xml中的ContextLoaderListener和DispatcherServlet区别
  10. 微信开发七(配置js-SDK,步骤2)
  11. Java实验9 T5. 给当前的类文件添加行号拷贝到txt文件
  12. Chrome、Firefox 浏览器常用设置及操作
  13. linux iconv 文件名,Linux_Linux系统下转换文件编码的方法小结,一、利用iconv命令进行文件内 - phpStudy...
  14. matlab 读取shp面文件,在matlab中将处理结果输出为shp文件
  15. 设置VC工程为Debug或Releas版本的方法
  16. java计算机毕业设计银创科技有限公司人事信息系统源码+数据库+系统+lw文档+部署
  17. 等额本金VS等额本息
  18. 算法竞赛——给定ATCG的DNA环状序列,求解最小表示字典序(附python代码及时间复杂度解析)
  19. python生成6位验证码随机数,需包含英文字母大写、小写和数字(含代码和注释)
  20. 开发人员为何应该使用苹果电脑,兼Mac OS X

热门文章

  1. Python快速实现一键抠图
  2. “城市大脑”治城一年 杭州“变”了
  3. Python 把两张图片拼起来
  4. 使用 docker 对容器资源进行限制
  5. 稳压二极管与TVS二极管的区别
  6. 晶联讯LCD(JLX128128G-610-PC)使用教程
  7. Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. Error: open /proc/sel
  8. sqlplus配置连接mysql_不安装oracle客户端用sqlplus连接数据库
  9. java 实现电子签名_Java实现数字签名
  10. pysot 中的异步多进程切图