NC46 加起来和为目标值的组合
难度 medium
描述
给出一组候选数C和一个目标数T,找出候选数中起来和等于T的所有组合。
C中的每个数字在一个组合中只能使用一次。
注意:
- 题目中所有的数字(包括目标数T)都是正整数
- 组合中的数字要按非递减排序
- 结果中不能包含重复的组合
- 组合之间的排序按照索引从小到大依次比较,小的排在前面,如果索引相同的情况下数值相同,则比较下一个索引。
示例1
输入:
[100,10,20,70,60,10,50],80
返回值:
[[10,10,60],[10,20,50],[10,70],[20,60]]
说明:
给定的候选数集是[100,10,20,70,60,10,50],目标数是80
解题思路:这道题目不是很难,还是类似于那种全排列的思路,先把数组排好序,然后进入递归函数,递归函数有几个参数:一个是结果二维数组res,原数组num,备选数组out,当前需要达到的目的值target,以及下一个索引的位置start。
进入递归函数后,首先判断当前需要达到的目的之target,如果target<0,说明递归到当前函数中,已经添加了过多的元素了,直接返回,如果target=0,那说明递归到当前元素时,元素个数刚好满足所有元素之和为目标值这个条件,这时候添加到结果数组,然后返回;否则target>0,说明还有继续添加的空间,于是就从start开始,把元素放到备选数组里,然后进入下一层的递归函数,下一层的递归函数有两个变化的地方:一个是target值,需要变为target-num[i],表示在新的递归函数里目标值的变化,另一个就是start这个值,需要变成i+1,表明当前元素已经添加过了,需要添加下一个元素了。在递归函数中两个需要注意的点:一个是剪枝,进入一个递归函数首先判断在当前函数中需要达到的target,如果target小于或等于0,那么说明不用再添加新的元素了,根据不同情况进行返回即可,这就是剪枝;另一个是去重,重复的情况不应该重复出现,比如num=[10,10,20,50],target=80中,可能会出现两组[10,20,50],因此需要将重复元素去掉,这里我们只要在添加新元素的时候进行判断,当i>0且num[i]和num[i-1]相等时,直接continue。
代码:
import java.util.*;
public class Solution {
public ArrayList<ArrayList<Integer>> combinationSum2(int[] num, int target) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
ArrayList<Integer> out = new ArrayList<>();
Arrays.sort(num);
int len = num.length;
helper(res, out, target, num, 0);
return res;
}
public void helper(ArrayList<ArrayList<Integer>> res, ArrayList<Integer> out, int target, int[] num, int start){
if(target<=0){
if(target<0) return;
else{
ArrayList<Integer> t = new ArrayList<>(out);
res.add(t);
return;
}
}
for(int i=start; i<num.length; i++){
if(i>start && num[i]==num[i-1]) continue;
out.add(num[i]);
helper(res, out, target-num[i], num, i+1);
out.remove(out.size()-1);
}
}
}
相似题目:
参考资料:
https://blog.nowcoder.net/n/cc7605c9ac99436e91baaa25d515cf18?f=comment
原文地址:https://www.cnblogs.com/zhengxch/p/15302333.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法