SorryToPerson logo
返回
算法2026-04-15·7 分钟

算法知识库:回溯算法实现

JavaScript/TypeScript 实现全排列、组合、子集等经典回溯问题。

回溯算法实现

1. 全排列

ts
function permute(nums: number[]): number[][] {
  const result: number[][] = [];
  const used = new Set<number>();

  function backtrack(path: number[]) {
    if (path.length === nums.length) {
      result.push([...path]);
      return;
    }

    for (const num of nums) {
      if (!used.has(num)) {
        used.add(num);
        path.push(num);
        backtrack(path);
        path.pop();
        used.delete(num);
      }
    }
  }

  backtrack([]);
  return result;
}

2. 组合

ts
function combine(n: number, k: number): number[][] {
  const result: number[][] = [];

  function backtrack(start: number, path: number[]) {
    if (path.length === k) {
      result.push([...path]);
      return;
    }

    for (let i = start; i <= n; i += 1) {
      path.push(i);
      backtrack(i + 1, path);
      path.pop();
    }
  }

  backtrack(1, []);
  return result;
}

3. 子集

ts
function subsets(nums: number[]): number[][] {
  const result: number[][] = [];

  function backtrack(start: number, path: number[]) {
    result.push([...path]);

    for (let i = start; i < nums.length; i += 1) {
      path.push(nums[i]);
      backtrack(i + 1, path);
      path.pop();
    }
  }

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

4. N 皇后问题

ts
function solveNQueens(n: number): string[][] {
  const result: string[][] = [];
  const board = Array.from({ length: n }, () => Array(n).fill('.'));

  function isValid(row: number, col: number): boolean {
    for (let i = 0; i < row; i += 1) {
      if (board[i][col] === 'Q') return false;
      if (col - (row - i) >= 0 && board[i][col - (row - i)] === 'Q') return false;
      if (col + (row - i) < n && board[i][col + (row - i)] === 'Q') return false;
    }
    return true;
  }

  function backtrack(row: number) {
    if (row === n) {
      result.push(board.map((r) => r.join('')));
      return;
    }

    for (let col = 0; col < n; col += 1) {
      if (isValid(row, col)) {
        board[row][col] = 'Q';
        backtrack(row + 1);
        board[row][col] = '.';
      }
    }
  }

  backtrack(0);
  return result;
}

5. 实现要点

  • 回溯通过尝试和撤销构建解空间。
  • 剪枝条件可显著优化性能。
  • 适合组合、排列、搜索类问题。
算法回溯JavaScript