- 39.组合总数
- 46.全排列—4
- 78.子集
- 79.单词搜索—1
- 连续差相同的数字—1
- 22.括号生成
- 113.路径总和-ii
- 473.火柴拼正方形
39.组合总数
var combinationSum = function (candidates, target) {
const sets = [];
const subset = [];
dfs(0, target, subset);
return sets;
function dfs(idx, target, subset) {
if (target < 0) return;
if (target === 0) {
sets.push([...subset]);
return;
}
for (let j = idx; j < candidates.length; j++) {
subset.push(candidates[j]);
dfs(j, target - candidates[j], subset);
subset.pop();
}
}
};
combinationSum([2, 3, 6, 7], 7);
46.全排列—4
var permuteUnique = function (nums) {
const sets = [];
const subset = [];
const used = Array(nums.length).fill(0);
dfs(subset);
console.log(sets);
function dfs(subset) {
for (let i = 0; i < nums.length; i++) {
if (subset.length === nums.length) {
sets.push([...subset]);
return;
}
if (used[i] === 1) continue;
if (i > 0 && nums[i] === nums[i - 1] && used[i - 1] === 1) continue;
used[i] = 1;
subset.push(nums[i]);
dfs(subset);
subset.pop();
used[i] = 0;
}
}
};
permuteUnique([1, 1, 2]);
78.子集
var subsets = function (nums) {
const sets = [];
const subset = [];
dfs(0, subset);
return sets;
function dfs(idx, subset) {
if (subset.length > nums.length) return;
sets.push([...subset]);
for (let i = idx; i < nums.length; i++) {
subset.push(nums[i]);
dfs(i + 1, subset);
subset.pop();
}
}
};
subsets([1, 2, 3]);
79.单词搜索—1
var exist = function (board, word) {
const m = board.length;
const n = board[0].length;
for (let i = 0; i < m; i++) {
for (let j = 0; j < n; j++) {
if (board[i][j] === word[0]) {
if (dfs(0, i, j)) return true;
}
}
}
return false;
function dfs(idx, x, y) {
if (x < 0 || x >= m || y < 0 || y >= n) return false;
if (board[x][y] !== word[idx]) return false;
if (idx === word.length - 1) return true;
board[x][y] = null;
const res =
dfs(idx + 1, x + 1, y) ||
dfs(idx + 1, x - 1, y) ||
dfs(idx + 1, x, y + 1) ||
dfs(idx + 1, x, y - 1);
board[x][y] = word[idx];
return res;
}
};
console.log(
exist(
[
["A", "B", "C", "E"],
["S", "F", "C", "S"],
["A", "D", "E", "E"],
],
"ABCCED"
)
);
console.log(
exist(
[
["A", "B", "C", "E"],
["S", "F", "C", "S"],
["A", "D", "E", "E"],
],
"ABCB"
)
);
连续差相同的数字—1
var numsSameConsecDiff = function (n, k) {
const sets = [];
const subset = [];
dfs(subset);
return sets;
function dfs(subset) {
for (let i = 0; i < 10; i++) {
if (subset.length === n) {
if (subset[0] !== 0) {
sets.push(+subset.join(""));
}
return;
}
if (
subset.length === 0 ||
Math.abs(subset[subset.length - 1] - i) === k
) {
subset.push(i);
dfs(subset);
subset.pop();
}
}
}
};
numsSameConsecDiff(3, 7);
22. 括号生成
var generateParenthesis = function (n) {
const res = [];
dfs(n, n, "");
console.log(res);
return res;
function dfs(leftRemain, rightRemain, str) {
if (str.length === 2 * n) {
res.push(str);
return;
}
if (leftRemain > 0) {
dfs(leftRemain - 1, rightRemain, str + "(");
}
if (leftRemain < rightRemain) {
dfs(leftRemain, rightRemain - 1, str + ")");
}
}
};
generateParenthesis(3);
113.路径总和-ii
var pathSum = function (root, targetSum) {
const res = [];
if (!root) return res;
dfs(root, targetSum - root.val, [root.val]);
console.log(res);
return res;
function dfs(node, remain, path) {
if (remain === 0 && !node.left && !node.right) {
res.push([...path]);
return;
}
if (!node.left && !node.right) return;
if (node.left) {
path.push(node.left.val);
dfs(node.left, remain - node.left.val, path);
path.pop();
}
if (node.right) {
path.push(node.right.val);
dfs(node.right, remain - node.right.val, path);
path.pop();
}
}
};
pathSum([5, 4, 8, 11, null, 13, 4, 7, 2, null, null, 5, 1], 22);
473. 火柴拼正方形
var makesquare = function (matchsticks) {
if (matchsticks.length < 4) return false;
const sum = matchsticks.reduce((x, y) => x + y, 0);
if (sum % 4) return false;
matchsticks.sort((a, b) => a - b);
const side = sum / 4;
if (matchsticks[0] > side) return false;
let edges = [0, 0, 0, 0];
return dfs(0);
function dfs(idx) {
if (idx === matchsticks.length) return true;
for (let i = 0; i < 4; i++) {
if (
edges[i] + matchsticks[idx] > side ||
(i > 0 && edges[i] == edges[i - 1])
)
continue;
edges[i] += matchsticks[idx];
if (dfs(idx + 1)) return true;
edges[i] -= matchsticks[idx];
}
return false;
}
};
console.log(makesquare([1, 1, 2, 2, 2]));