题目描述:
大致思路:
采用回溯算法.
先写一个标准的全排列:
//全排列
export function fullPermutation(nums: number[]) {
const res: number[][] = [];
const fn = (index: number, path: number[]) => {
if (path.length === nums.length) {
res.push([...path]);
return;
}
for (let i = index; i < nums.length; ++i) {
path.push(nums[i]);
fn(i, path);
path.pop();
}
};
fn(0, []);
return res;
}
而现在要做的就是加入target, 判断数组中元素的和与target相等, 这里采用相减, 当余数为0时表示当前path符合条件.
代码如下:
function combinationSum(candidates: number[], target: number): number[][] {
const res: number[][] = [];
//判断边界情况
if (candidates.length === 0) {
return [];
}
const fn = (residue: number, path: number[], index: number) => {
//题目限制条件
if (path.length > 150) {
return;
}
if (residue === 0) {
//符合条件的path, 这里需要用拷贝后的数组, 因为是一维数组, 所以这里浅拷贝就可以了
res.push([...path]);
return;
}
for (let i = index; i < candidates.length; i++) {
//当当前值大于余数是, 直接进入下次循环
if (candidates[i] > residue) {
continue;
}
path.push(candidates[i]);
//递归, 将当前余数作为参数传递下去
fn(residue - candidates[i], path, i);
path.pop();
}
};
fn(target, [], 0);
return res;
}