DAILY DOCDAILY DOC
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
Rust
Node
Notes
Ubuntu
Leetcode
  • it-tools
  • excalidraw
  • linux-command
  • Array

    • 数组
    • 二分查找
    • moveZeros
  • Dynamic-programming

    • 动态规划
  • 刷题指南
  • String

    • 字符串
  • bitwise-operator

    • 位运算符
  • heap
  • history

    • [1014] 最佳观光组合
    • [1022] 从根到叶的二进制数之和
    • [104] 二叉树的最大深度
    • [11] 盛最多水的容器
    • [110] 平衡二叉树
    • [1227] 飞机座位分配概率
    • [129] 求根节点到叶节点数字之和
    • [1306] 跳跃游戏 III
    • [148] 排序链表
    • 155.最小栈
    • [165] 比较版本号
    • 1763. 最长的美好子字符串
    • [1870] 准时到达的列车最小时速
    • [199] 二叉树的右视图
    • [21] 合并两个有序链表
    • 215.数组中的第 k 个最大元素
    • [2306] 公司命名
    • [234] 回文链表
    • [2516] 每种字符至少取 K 个
    • [316] 去除重复字母
    • [3171] 找到按位或最接近 K 的子数组
    • [322] 零钱兑换
    • [41] 缺失的第一个正数
    • [44] 通配符匹配
    • [494] 目标和
    • [509] 斐波那契数
    • [518] 零钱兑换 II
    • [62] 不同路径
    • [676] 实现一个魔法字典
    • 70 爬楼梯
    • [718] 最长重复子数组
    • [78] 子集
    • [82] 删除排序链表中的重复元素 II
    • [871] 最低加油次数
    • [88] 合并两个有序数组
    • [887] 鸡蛋掉落
    • 958.二叉树的完全性检验
    • [98] 验证二叉搜索树
    • [983] 最低票价
    • leetcode practice
    • 约瑟夫问题
    • 移除重复节点
  • linked-list

    • 706. 设计哈希映射
    • 链表
  • stack

    • stack
  • tree

    • Tree Traversal
    • 二叉树的最近公共祖先
    • 二叉树
    • 题目
  • leetCode 刷题
  • 回溯
  • 排序算法

回溯

22. 括号生成

Javascript
function generateParenthesis(n) {
    const res = [];
    backtrack('', 0, 0);
    return res;

    function backtrack(s, left, right) {
        if (s.length === 2 * n) {
            res.push(s);
            return;
        }
        if (left < n) {
            backtrack(s + '(', left + 1, right);
        }
        if (right < left) {
            backtrack(s + ')', left, right + 1);
        }
    }
}

46. 全排列

回溯算法 穷举

做选择的时候需要判断一下 是否已经 选择过了 时间复杂度 O(n!) 空间复杂度 O(n)

Javascript
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
    const ans = [];
    backtrack([], nums);
    return ans;

    function backtrack(path, nums) {
        if (path.length === nums.length) {
            ans.push(path.slice());
            return;
        }

        for (let i = 0; i < nums.length; i++) {
            if (path.includes(nums[i])) {
                continue;
            }
            path.push(nums[i]);
            backtrack(path, nums);
            path.pop();
        }
    }
};

47. 全排列 II

回溯算法

排序后,通过 used 剪枝。

Javascript
function permuteUnique(nums) {
    const res = [];
    const used = Array(nums.length).fill(false);
    nums.sort((a, b) => a - b);

    function backtrack(path) {
        if (path.length === nums.length) {
            res.push([...path]);
            return;
        }
        for (let i = 0; i < nums.length; i++) {
            if (used[i]) {
                continue;
            }
            if (i > 0 && nums[i] === nums[i - 1] && !used[i - 1]) {
                continue;
            }
            path.push(nums[i]);
            used[i] = true;
            backtrack(path);
            path.pop();
            used[i] = false;
        }
    }

    backtrack([]);
    return res;
}

51. N 皇后

Javascript
/**
 * @param {number} n
 * @return {string[][]}
 */
var solveNQueens = function (n) {
    let map = Array.from({ length: n }, () => new Array(n).fill('.'));
    let ans = [];
    backtrack(0);
    return ans;

    function backtrack(row) {
        if (row === n) {
            ans.push(map.map(arr => arr.join('')));
            return;
        }
        for (let col = 0; col < n; col++) {
            if (!isValid(row, col)) {
                continue;
            }
            map[row][col] = 'Q';
            backtrack(row + 1);
            map[row][col] = '.';
        }
    }

    function isValid(row, col) {
        // 同一列中不能有 Q
        for (let i = 0; i < row; i++) {
            if (map[i][col] === 'Q') return false;
        }
        // 检查左上方是否有冲突 左上角斜线不能有
        for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (map[i][j] === 'Q') return false;
        }

        // 检查右上方是否有冲突 右上角斜线不能有
        for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
            if (map[i][j] === 'Q') return false;
        }
        return true;
    }
};

52. N 皇后 II

Javascript
/**
 * @param {number} n
 * @return {number}
 */
var totalNQueens = function (n) {
    let map = new Array(n).fill().map(() => new Array(n).fill('.'));

    return backtrack(0);

    function backtrack(row) {
        if (row === n) {
            return 1;
        }

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

    function isValid(row, col) {
        // 检查列中是否已尽有 Q
        for (let i = 0; i < row; i++) {
            if (map[i][col] === 'Q') return false;
        }

        // 检查左上方是否有冲突
        for (let i = row - 1, j = col - 1; i >= 0 && j >= 0; i--, j--) {
            if (map[i][j] === 'Q') return false;
        }

        // 检查右上方是否有冲突
        for (let i = row - 1, j = col + 1; i >= 0 && j < n; i--, j++) {
            if (map[i][j] === 'Q') return false;
        }

        return true;
    }
};
Last Updated:
Contributors: rosendo
Prev
leetCode 刷题
Next
排序算法