NC46 加起来和为目标值的组合

时间:2021-09-16
本文章向大家介绍NC46 加起来和为目标值的组合,主要包括NC46 加起来和为目标值的组合使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

难度 medium

描述
给出一组候选数C和一个目标数T,找出候选数中起来和等于T的所有组合。
C中的每个数字在一个组合中只能使用一次。

注意:

  1. 题目中所有的数字(包括目标数T)都是正整数
  2. 组合中的数字要按非递减排序
  3. 结果中不能包含重复的组合
  4. 组合之间的排序按照索引从小到大依次比较,小的排在前面,如果索引相同的情况下数值相同,则比较下一个索引。

示例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