算法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