求和为target的数字组合

题目:现给定⼀个整数数组(数组⻓度⼤于等于 5)nums 和⼀个整数⽬标值 target,请你在该数组中
找出和为⽬标值 target 的那 n(n<nums.length) 个整数,并返回它们的数组(如果有多个下标组合
都满⾜,则返回下标和最⼩的那⼀组)的下标。
注意:数组中同⼀个元素在答案⾥不能重复出现。 ⽐如输⼊:nums = [3,2,4,5,7],n=3,
target = 10 输出:[0,1,3]

答案from ChatGPT:

        function combinationSum(nums, n, target) {
            let result = [];
            let combination = [];

            function backtrack(start, target) {
                if (target === 0 && combination.length === n) {
                    result.push([...combination]);
                    return;
                }

                for (let i = start; i < nums.length; i++) {
                    if (target < nums[i]) {
                        break;
                    }

                    combination.push(i);
                    backtrack(i + 1, target - nums[i]);
                    combination.pop();
                }
            }

            backtrack(0, target);
            return result[0];
        }

 个人对此代码的理解:

比如输⼊:nums = [0,1,2,3,4,5,6,7,8,9],n=4,target = 12

按题目要求即从nums中选择4个数,并且其和为12,根据中学时学习的数学组合可知,选择第一个数时nums中有10个数,有10种选择,代码中表示为第一层for循环,当第一个数字选定以后,选择第二个数的时候还剩9个数,我们可以从这9个数中选择1个,即代码中的递归回调中的for循环...以此类推。最后筛选出符合条件的数字组合。因为这是组合,并非排列,没有顺序要求,所以数字选取直接一轮一轮向后挑选即可,代码中表示为i + 1。数字组合如下:

0123,0124,0125,0126,0127,0128,0129

0134,0135,0136,0137,0138,0139

0145,0146,0147,0148,0149

0156,0157,0158,0159

......

0234,0235,0236,0237,0238,0239

0245,0246,0247,0248,0249

......

1234,1235,1236,1237,1238,1239

 ......

posted @ 2023-08-17 15:46  黄燃  阅读(266)  评论(0编辑  收藏  举报