- 39.组合总数
- 46.全排列—4
- 78.子集
- 79.单词搜索—1
- 连续差相同的数字—1
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);