每日一道算法Day24

81 阅读1分钟

题目描述:

image.png

大致思路:

采用回溯算法.

先写一个标准的全排列:

//全排列
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;
}