Skip to content

回溯

数组的组合

给一个数组 [1, 2, 3, 4, 5],目标值为 6,输出 [ [ 1, 2, 3 ], [ 1, 5 ], [ 2, 4 ] ]

js
function getAllArrays(arr, target) {
  function backtrack(start, target, path) {
    if (target === 0) {
      res.push(path);
      return;
    }
    for (let i = start; i < arr.length; i++) {
      if (arr[i] > target) {
        break;
      }
      backtrack(i + 1, target - arr[i], path.concat(arr[i]));
    }
  }

  const res = [];
  backtrack(0, target, []);

  return res;
}

getAllArrays([1, 2, 3, 4, 5], 6)
// [ [ 1, 2, 3 ], [ 1, 5 ], [ 2, 4 ] ]

电话号码的字母组合

js
var letterCombinations = function(digits) {
  if (digits.length == 0) return [];
  const res = [];
  const map = {
    2: 'abc',
    3: 'def',
    4: 'ghi',
    5: 'jkl',
    6: 'mno',
    7: 'pqrs',
    8: 'tuv',
    9: 'wxyz'
  }
  const backtrack = (curStr, i) => {
    if (i > digits.length - 1) {
      res.push(curStr)
      return;
    }
    const letters = map[digits[i]];
    for (const letter of letters) {
      backtrack(curStr + letter, i + 1);
    }
  }
  backtrack('', 0);
  return res;
};

全排列

js
const permute = (nums) => {
  function backtrack(list, temp, nums) {
    if (temp.length === nums.length) {
        return list.push([...temp]);
    }
    for (let i = 0; i < nums.length; i++) {
        if (temp.includes(nums[i])) continue;
        temp.push(nums[i]);
        backtrack(list, temp, nums); // 执行递归公式
        temp.pop();
    }
  }

  let list = [];
  backtrack(list, [], nums);
  return list;
};

Released under the MIT License.