LeetCode 39 组合总和
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 组合总和相关推荐
- leetcode 39. 组合总和 40. 组合总和 II
leetcode 39. 组合总和 40. 组合总和 II 组合总和 给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和 ...
- LeetCode 39. 组合总和(排列组合 回溯)
1. 题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无 ...
- leetcode - 39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限制重复被选 ...
- leetcode 39. 组合总和
执行用时:4 ms, 在所有 C++ 提交中击败了91.98%的用户 内存消耗:10.5 MB, 在所有 C++ 提交中提交中击败了90.06%的用户 给你一个无重复元素的整数数组 candidate ...
- Leetcode 39 组合总和 (每日一题 20210806)
给定一个无重复元素的正整数数组 candidates 和一个正整数 target ,找出 candidates 中所有可以使数字和为目标数 target 的唯一组合.candidates 中的数字可以 ...
- leetcode 39. 组合总和 思考分析
目录 1.题目 2.思考分析 3.未经优化代码 4.剪枝优化 1.题目 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 ...
- leetcode —— 39. 组合总和
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合.candidates 中的数字可以无限制重复被选取 ...
- LeetCode 39. 组合总和(回溯+剪枝)
题目描述 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的数字可以无限 ...
- LeetCode 39:组合总和(Javascript 解答)
原题目 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回 ...
最新文章
- edit怎么读英语_名师说学习:英语学习有方法
- 程序员如何避免“滴滴式裁员”悲剧?
- java string与integer_Java中Integer和String浅谈
- 12月第1周全球五大顶级域名总量呈负增长 减2.5万个
- 历时3年,清华大学iDLab实验室打造《强化学习和控制》课程及讲义!
- boost智能指针之shared_ptr,scoped_ptr,intrusive_ptr,weak_ptr源码简析
- [linux]unixODBC的安装配置说明
- 常用Sqlserver中的查询语句
- web.xml中的ContextLoaderListener和DispatcherServlet区别
- 微信开发七(配置js-SDK,步骤2)
- Java实验9 T5. 给当前的类文件添加行号拷贝到txt文件
- Chrome、Firefox 浏览器常用设置及操作
- linux iconv 文件名,Linux_Linux系统下转换文件编码的方法小结,一、利用iconv命令进行文件内 - phpStudy...
- matlab 读取shp面文件,在matlab中将处理结果输出为shp文件
- 设置VC工程为Debug或Releas版本的方法
- java计算机毕业设计银创科技有限公司人事信息系统源码+数据库+系统+lw文档+部署
- 等额本金VS等额本息
- 算法竞赛——给定ATCG的DNA环状序列,求解最小表示字典序(附python代码及时间复杂度解析)
- python生成6位验证码随机数,需包含英文字母大写、小写和数字(含代码和注释)
- 开发人员为何应该使用苹果电脑,兼Mac OS X
热门文章
- Python快速实现一键抠图
- “城市大脑”治城一年 杭州“变”了
- Python 把两张图片拼起来
- 使用 docker 对容器资源进行限制
- 稳压二极管与TVS二极管的区别
- 晶联讯LCD(JLX128128G-610-PC)使用教程
- Emulate Docker CLI using podman. Create /etc/containers/nodocker to quiet msg. Error: open /proc/sel
- sqlplus配置连接mysql_不安装oracle客户端用sqlplus连接数据库
- java 实现电子签名_Java实现数字签名
- pysot 中的异步多进程切图