leecode刷题 之 39 Combination Sum

题意:给定一个集合C,与一个数值Target。找出所有满足和为target的集合。
注意元素可以重复使用。
例如:C=[2,3,4,6,7] target = 7
结果为:[ [2,2,3],[3,4],[7]]

public class Combination{

        public static List<List<Integer>> combinationSum1 = new ArrayList<>();

        public static void getCombinationSum1(int[] arrays, int target) {
            //步骤一 将数据排序
            Arrays.sort(arrays);
            //递归求和
            combinationSum(arrays, 0, 0, new ArrayList<Integer>(),target);
        }

        /**
         * 求和,使得和为target(arrays中元素可以重复使用)
         *
         * @param arrays 总的元素
         * @param start 开始计算的位置
         * @param sum 当前已有元素的和
         * @param currentAdderForSum 当前和为sum是的元素元素组成
         * @param target 目标的值
         */
        private static void combinationSum(int[] arrays, int start, int sum, ArrayList<Integer> currentAdderForSum, int target) {
            if (sum == target) { //当前的集合已经满足和为target的要求,则将数据存储一下
                combinationSum1.add(new ArrayList<>(currentAdderForSum)); //注意这里一定要重新New集合
                return;
            }
            for (int i = start; i < arrays.length; i++) {
                //如果集合中有重复元素则为了避免重复,跳过本次循环
                if (i > start && arrays[i] == arrays[i - 1]) {
                    continue;
                }

                if ((sum + arrays[i]) > target) {
                    //因为这是一个经过排序之后的升序数组,再接下来遍历循环没有意义,因此退出循环
                    break;
                }
                currentAdderForSum.add(arrays[i]);
                 //从当前开始开始往后遍包括当前
                combinationSum(arrays,i, sum + arrays[i], currentAdderForSum, target);
                currentAdderForSum.remove(currentAdderForSum.size() - 1);
            }
        }

    }

运行结果如下:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/dirksmaller/article/details/79636921