精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十五周算法訓練營——回溯算法

開發 前端
解決一個回溯問題,實際上就是一個決策樹的遍歷過程,只需要思考三個問題:路徑,選擇列表,結束條件。

今天是十五周算法訓練營的第十周,主要講回溯算法專題。

解決一個回溯問題,實際上就是一個決策樹的遍歷過程,只需要思考三個問題:

  1. 路徑:也就是已經做出的選擇
  2. 選擇列表:也就是你當前可以做的選擇
  3. 結束條件:也就是到達決策樹底層,無法再做選擇的條件

全排列

給定一個不含重復數字的數組 nums ,返回其 所有可能的全排列 。你可以按任意順序 返回答案。

示例 1:

輸入:nums = [1,2,3] 輸出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]。

function permute(nums) {
    const result = [];

    /**
     * 路徑:記錄到track中
     * 選擇列表:不存在與nums中的哪些數
     * 結束條件:當nums中的元素全部在track中出現
     */
    const backtrack = (track, nums) => {
        // 結束條件
        if (track.length === nums.length) {
            result.push([...track]);
            return;
        }

        for (let i = 0; i < nums.length; i++) {
            if (track.includes(nums[i])) {
                continue;
            }

            // 做選擇
            track.push(nums[i]);
            // 進入下一層
            backtrack(track, nums);
            // 取消選擇
            track.pop();
        }
    };

    const track = [];

    backtrack(track, nums);

    return result;
}

const nums = [1, 2, 3];
console.log(permute(nums));

全排列II

給定一個可包含重復數字的序列 nums ,按任意順序 返回所有不重復的全排列。

示例 1:

輸入:nums = [1,1,2] 輸出: [[1,1,2], [1,2,1], [2,1,1]]。

function permuteUnique(nums) {
    const result = [];

    /**
     * 路徑:記錄到track中
     * 選擇列表:當前沒有被訪問過,且前一個值若為相通知,且被訪問過
     * 結束條件:全部值都被訪問了一遍
     */
    const backtrack = (sortNums, track, visits) => {
        if (track.length === sortNums.length) {
            result.push([...track]);
            return;
        }

        for (let i = 0; i < sortNums.length; i++) {
            // i > 0 && nums[i] === nums[i - 1] && !visits[i - 1]
            // 上述一行的判斷是當前值和前一個值相等,但是前一個值沒有被訪問過,表示前一個值不在該值路徑的上幾層,表示在同一層前面出現過,所以該值要跳過
            if (visits[i] || (i > 0 && sortNums[i] === sortNums[i - 1] && !visits[i - 1])) {
                continue;
            }

            // 做選擇
            track.push(sortNums[i]);
            visits[i] = 1;

            // 選擇下一層
            backtrack(sortNums, track, visits);

            // 取消選擇
            track.pop();
            visits[i] = 0;
        }
    };

    const track = [];

    nums.sort((a, b) => a - b);

    const visits = (new Array(nums.length)).fill(0);

    backtrack(nums, track, visits);

    return result;
}

const nums = [1, 1, 2];
console.log(permuteUnique(nums));

N皇后

按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。

n 皇后問題 研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。

給你一個整數 n ,返回所有不同的 n 皇后問題 的解決方案。

每一種解法包含一個不同的 n 皇后問題 的棋子放置方案,該方案中 'Q' 和 '.' 分別代表了皇后和空位。

示例 1:

圖片

輸入:n = 4 輸出:[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]] 解釋:如上圖所示,4 皇后問題存在兩個不同的解法。

// 該問題本質上和全排列問題差不多,決策樹上的每一層表示棋盤上的每一行,每個節點可以做出的選擇是在該行的任意一列放置一個皇后
function solveNQueens(n) {
    const result = [];

    // 判斷是否可以在[row, col]放置皇后
    const isValid = (board, row, col) => {
        // 判斷該列是否存在皇后
        for (let i = 0; i < row; i++) {
            if (board[i][col] === 'Q') {
                return false;
            }
        }

        // 判斷左上方是否存在皇后沖突
        let leftRow = row - 1;
        let leftCol = col - 1;
        while (leftRow >= 0 && leftCol >= 0) {
            if (board[leftRow][leftCol] === 'Q') {
                return false;
            }
            leftRow--;
            leftCol--;
        }

        // 判斷右上是否存在皇后沖突
        let rightRow = row - 1;
        let rightCol = col + 1;
        while (rightRow >= 0 && rightCol < n) {
            if (board[rightRow][rightCol] === 'Q') {
                return false;
            }
            rightRow--;
            rightCol++;
        }

        return true;
    };
    /**
     * 路徑:board中小于row的那些行都已經成功放置了皇后
     * 選擇列表:第row行的所有列都是放置皇后的選擇
     * 結束條件:row超過board的最后一行
     */

    const backtrack = (board, row) => {
        // 觸發結束條件
        if (row === board.length) {
            result.push(board.map(item => {
                return item.join('');
            }));
            return;
        }

        for (let col = 0; col < n; col++) {
            // 排除不合法的選擇
            if (!isValid(board, row, col)) {
                continue;
            }

            // 做選擇
            board[row][col] = 'Q';

            // 進行下一層
            backtrack(board, row + 1);

            // 取消選擇
            board[row][col] = '.';
        }
    };

    const board = new Array(n);
    for (let i = 0; i < n; i++) {
        board[i] = (new Array(n)).fill('.');
    }

    backtrack(board, 0);

    return result;
}

const n = 4;
console.log(solveNQueens(n));

組合總和

給你一個 無重復元素 的整數數組 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,并以列表形式返回。你可以按 任意順序 返回這些組合。

candidates 中的 同一個 數字可以 無限制重復被選取 。如果至少一個數字的被選數量不同,則兩種組合是不同的。

對于給定的輸入,保證和為 target 的不同組合數少于 150 個。

示例 1:

輸入:candidates = [2,3,6,7], target = 7 輸出:[[2,2,3],[7]] 解釋: 2 和 3 可以形成一組候選,2 + 2 + 3 = 7 。注意 2 可以使用多次。 7 也是一個候選, 7 = 7 。 僅有這兩種組合。

function combinationSum(candidates, target) {
    const result = [];

    /**
     * 路徑:記錄在track中
     * 選擇列表:index及其之后的元素
     * 結束條件:其和為target,則進行存儲,超過,則不存儲結束
     */
    const backtrack = (sortNums, track, trackNum, index) => {
        if (trackNum === target) {
            result.push([...track]);
            return;
        } else if (trackNum > target) {
            return;
        }

        for (let i = index; i < sortNums.length; i++) {
            // 做選擇
            track.push(sortNums[i]);
            trackNum += sortNums[i];

            // 進入下一層
            backtrack(sortNums, track, trackNum, i);

            // 取消選擇
            track.pop();
            trackNum -= sortNums[i];
        }
    };

    const track = [];
    let trackNum = 0;

    candidates.sort((a, b) => a - b);

    backtrack(candidates, track, trackNum, 0);

    return result;
}

const candidates = [2,3,6,7];
const target = 7;
console.log(combinationSum(candidates, target));

子集II

給你一個整數數組 nums ,其中可能包含重復元素,請你返回該數組所有可能的子集(冪集)。

解集 不能 包含重復的子集。返回的解集中,子集可以按 任意順序 排列。

示例 1:

輸入:nums = [1,2,2] 輸出:[[],[1],[1,2],[1,2,2],[2],[2,2]]。

function subsetsWithDup(nums) {
    const result = [];

    /**
     * 路徑:記錄在track中
     * 選擇列表:index及其之后的元素
     * 結束條件:將結果進行存儲
     */
    const backtrack = (sortNums, track = [], index = 0) => {
        result.push([...track]);

        for (let i = index; i < sortNums.length; i++) {
            // 對于排序后相同的元素應該跳過
            if (i > index && sortNums[i] === sortNums[i - 1]) {
                continue;
            }
            // 做選擇
            track.push(sortNums[i]);
            // 進入下一層
            backtrack(sortNums, track, i + 1);
            // 取消選擇
            track.pop();
        }
    };

    const track = [];
    nums.sort((a, b) => a - b);
    backtrack(nums, track, 0);

    return result;
}

const nums = [1, 2, 2];
console.log(subsetsWithDup(nums));

遞增子序列

給你一個整數數組 nums ,找出并返回所有該數組中不同的遞增子序列,遞增子序列中 至少有兩個元素 。你可以按 任意順序 返回答案。

數組中可能含有重復元素,如出現兩個整數相等,也可以視作遞增序列的一種特殊情況。

示例 1:

輸入:nums = [4,6,7,7] 輸出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]。

function findSubsequences(nums) {
    const result = [];

    const backtrack = (track, start) => {
        // 如果其長度大于等于2,則算一個子序列
        if (track.length >= 2) {
            result.push([...track]);
        }

        const map = new Map();
        for (let i = start; i < nums.length; i++) {
            // 判斷是否合法
            // 同一層只能用一次
            if (map.has(nums[i])) {
                continue;
            }
            // 后一層比前一層大
            if (nums[i] < track[track.length - 1]) {
                continue;
            }
            map.set(nums[i], true);
            // 做選擇
            track.push(nums[i]);
            // 進入下一層
            backtrack(track, i + 1);
            // 取消選擇
            track.pop();
        }
    };

    const track = [];
    backtrack(track, 0);

    return result;
}

const nums = [1, 2, 3 ,1,1,1,1];
console.log(findSubsequences(nums));
責任編輯:姜華 來源: 前端點線面
相關推薦

2023-07-03 08:01:54

2023-05-29 07:31:35

單調棧數組循環

2023-04-17 07:33:11

反轉鏈表移除鏈表

2023-05-22 07:31:32

Nums快慢指針

2023-04-03 07:33:05

數組排序快速排序法

2023-07-10 08:01:13

島嶼問題算法

2023-05-15 07:32:01

算法訓練滑動窗口

2023-06-26 07:31:44

屬性物品背包

2023-06-13 06:51:15

斐波那契數算法

2023-06-19 07:31:34

普通動態規劃字符串

2021-09-23 10:53:43

數據中心

2016-08-05 20:21:51

CTO導師技術

2016-08-05 18:53:25

CTO導師技術

2023-05-08 07:32:03

BFSDFS路徑

2021-07-08 20:22:05

AI

2013-04-22 12:58:14

TechExcel敏捷研發

2021-01-30 11:10:51

算法回溯組合

2022-02-04 21:56:59

回溯算法面試

2009-04-29 18:12:41

GAUPS培訓

2016-10-17 13:50:31

點贊
收藏

51CTO技術棧公眾號

成人午夜视频在线| 亚洲国产国产| 自拍偷自拍亚洲精品播放| 91最新在线免费观看| 91成人福利视频| 999久久精品| 精品久久久一区二区| 日本高清久久一区二区三区| 亚洲国产无线乱码在线观看| 久久久久av| 亚洲激情视频在线| 国产真人无码作爱视频免费| 国产素人视频在线观看| 成人黄色小视频在线观看| 日本免费在线精品| 三级在线观看免费大全| 精品深夜福利视频| 欧美三片在线视频观看| av久久久久久| 国产综合在线观看| 粉嫩一区二区三区在线看| 欧美又大粗又爽又黄大片视频| 亚洲天堂精品一区| 老牛影视av一区二区在线观看| 欧美日韩久久不卡| 一二三四视频社区在线| 好操啊在线观看免费视频| av电影天堂一区二区在线| 国产精品日日摸夜夜添夜夜av| 久久久久久久久久99| 欧美日韩黑人| 亚洲国产精品电影在线观看| 天天干天天操天天做| 美女搞黄视频在线观看| 亚洲私人黄色宅男| 欧美一区二区三区在线播放 | 国内揄拍国内精品少妇国语| 五月天婷婷丁香网| 西瓜成人精品人成网站| 精品欧美乱码久久久久久1区2区| 久久久久国产一区| 亚洲欧美韩国| 亚洲成人自拍偷拍| 精品国产一区二区三区在线| 成人高清免费在线播放| aaa亚洲精品一二三区| 亚洲精品免费av| 中文字幕+乱码+中文字幕明步| 99成人精品| 欧美人与性动交a欧美精品| 中文字幕91视频| 美日韩中文字幕| 亚洲精品国产免费| aaa黄色大片| 国产视频网站一区二区三区| 欧美男生操女生| 三年中国国语在线播放免费| 亚洲同志男男gay1069网站| 午夜精品久久久久影视| 欧美乱大交xxxxx潮喷l头像| 性爱视频在线播放| 亚洲欧美日韩国产一区二区三区| 亚洲激情一区二区三区| 成人在线免费观看| 国产欧美日韩视频一区二区| 色播五月综合| 2017亚洲天堂1024| 国产精品久久毛片| 亚洲永久激情精品| 午夜视频成人| 亚洲欧美怡红院| 在线无限看免费粉色视频| 在线观看黄av| 成人免费一区二区三区视频| 2025韩国大尺度电影| 麻豆电影在线播放| 亚洲天堂a在线| 成人黄色片免费| 51精品在线| 欧美日韩国产专区| 日本熟妇人妻xxxxx| 精品国模一区二区三区| 欧美在线一二三| 一起操在线视频| 国产美女精品视频免费播放软件 | 日韩最新在线视频| 小嫩苞一区二区三区| 2023国产精品久久久精品双| 欧美大成色www永久网站婷| 精品无码一区二区三区电影桃花| 在线精品福利| 国产成人aa精品一区在线播放| 在线观看免费高清视频| 国产一区二区不卡在线| 国产精品区一区二区三在线播放 | 青青青在线视频| 亚洲福利国产| 欧洲精品在线视频| 中文文字幕一区二区三三| 国产一区二区三区精品欧美日韩一区二区三区 | 18禁男女爽爽爽午夜网站免费| 偷拍中文亚洲欧美动漫| 欧美精品高清视频| 中文字幕乱视频| 精品久久影视| 色与欲影视天天看综合网| 韩国av中文字幕| 99精品全国免费观看| 盗摄系列偷拍视频精品tp| 亚洲人成五月天| 国产麻豆a毛片| 亚洲国产美女| 国产日韩欧美在线视频观看| 亚洲国产成人精品一区二区三区| www精品美女久久久tv| 亚洲最大色综合成人av| 国产高潮在线| 欧美久久久久久久久久| 800av在线播放| 日韩中文欧美| 2019中文在线观看| 国产视频第二页| 91看片淫黄大片一级在线观看| 中文字幕在线乱| 韩国主播福利视频一区二区三区| 欧美一区二区三区四区五区| 美女又爽又黄视频毛茸茸| 亚洲国产日韩欧美在线| 国产精品成熟老女人| 蜜桃视频久久一区免费观看入口| 国产精品素人视频| 久草资源站在线观看| 网站一区二区| 日韩视频在线观看免费| 91久久国产综合久久91| av在线不卡电影| 91传媒免费视频| 欧美aaa级| 国产亚洲aⅴaaaaaa毛片| 99免费在线观看| 国产精品自在欧美一区| 亚洲国产激情一区二区三区| 波多野结衣亚洲| 亚洲国产精久久久久久久| 色欲一区二区三区精品a片| 日本不卡高清视频| 欧美精品亚洲精品| 香蕉伊大人中文在线观看| 精品国产三级a在线观看| 18岁成人毛片| 国内精品久久久久影院色| 亚洲欧美国产不卡| 一区二区视频免费完整版观看| 日韩激情av在线免费观看| 国产精品成人免费一区二区视频| 国产一二三精品| 综合国产精品久久久| 天天操天天爱天天爽| 日韩欧美另类中文字幕| 不卡av在线播放| 91免费视频播放| 自拍偷拍亚洲激情| www.午夜av| 久久精品久久久| 成人精品视频久久久久| 麻豆影视在线观看_| 欧美日韩不卡在线| 欧美色视频一区二区三区在线观看| 日本美女一区二区三区| 亚洲精品白虎| 伊人久久大香伊蕉在人线观看热v| 色婷婷久久一区二区| 91麻豆一区二区| 一区二区三区四区亚洲| 亚洲女则毛耸耸bbw| 伊人久久亚洲影院| 久久久亚洲综合网站| 美女18一级毛片一品久道久久综合| 亚洲人成电影网站色…| 中文字幕欧美色图| 中文字幕亚洲一区二区va在线| 992kp免费看片| 欧美三级网页| 黄色91av| 亚洲a∨精品一区二区三区导航| 日韩在线观看网站| www.久久久久久| 精品久久久久久久中文字幕 | 97品白浆高清久久久久久| 91国语精品自产拍在线观看性色 | 日韩在线播放视频| 亚洲第一视频在线播放| 日韩欧美一区二区三区| 激情无码人妻又粗又大| 粉嫩久久99精品久久久久久夜| 免费看又黄又无码的网站| 区一区二视频| 国产久一道中文一区| 丁香婷婷久久| 性欧美长视频免费观看不卡| 国产女人在线视频| 欧美不卡激情三级在线观看| 在线观看日本网站| 亚洲精品视频一区| 国产高清一区二区三区四区| 国产精品一区二区久久不卡| 日本三级免费网站| 欧美搞黄网站| 亚洲女人被黑人巨大进入| 能在线观看的av网站| 久久精品国内一区二区三区水蜜桃| 精品不卡在线| 台湾天天综合人成在线| 国语对白做受69| 天堂8在线视频| 欧美视频免费在线| 欧美成人手机视频| 久久亚洲捆绑美女| 91成人在线观看喷潮蘑菇| 日日骚欧美日韩| 黄色一级片国产| 香蕉久久99| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 日本一级淫片演员| 91成人福利| 成人中文字幕在线观看| 国产理论在线| 久久精品人人做人人爽| 天天躁日日躁狠狠躁伊人| 欧美日韩一级二级| 久久久久久久黄色片| 亚洲人123区| 亚洲av毛片基地| 本田岬高潮一区二区三区| 黄色手机在线视频| 91久久综合| 国产资源在线免费观看| 97久久视频| 日本视频精品一区| 亚洲国产合集| 国产综合动作在线观看| 欧洲精品99毛片免费高清观看| 992tv成人免费影院| 金瓶狂野欧美性猛交xxxx| 精品国产一区二区三区久久久| 日韩精品系列| 日韩精品福利在线| 日本精品久久久久久| 欧美一级久久久| 国产成人精品亚洲| 欧洲生活片亚洲生活在线观看| 国产成人在线观看网站| 亚洲成a人v欧美综合天堂| 精品在线视频免费观看| 亚洲久草在线视频| 可以免费看av的网址| 久久九九99视频| 日韩中文字幕有码| 2017欧美狠狠色| 成人在线视频免费播放| 99re视频精品| 三上悠亚 电影| 国产精品一品视频| 欧美一性一乱一交一视频| 久久精品美女视频| 亚洲欧美日韩综合aⅴ视频| 大胸美女被爆操| 亚洲色图欧美激情| 一区二区国产精品精华液| 成人欧美一区二区三区| 日韩成人毛片视频| 亚洲精品乱码久久久久久久久| 五月天色婷婷丁香| 国产精品久久久久一区二区三区| 麻豆网址在线观看| 亚洲精品免费在线| 久久艹精品视频| 欧美日韩综合视频网址| 91丝袜一区二区三区| 色婷婷综合久久久中文字幕| 制服丝袜在线一区| 欧美日韩一区二区三区高清| 欧美一级淫片免费视频黄| 欧美亚洲高清一区| 国产激情视频在线播放| 亚洲精品在线网站| 天天综合在线视频| 亚洲免费av网址| 欧美性猛交xxx乱大交3蜜桃| 欧美超级乱淫片喷水| 懂色av一区| 国产精品xxx视频| 欧美综合社区国产| 超碰97在线资源| 免费成人网www| 神马欧美一区二区| 亚洲影视一区| 天天摸天天碰天天添| 蜜桃av一区二区在线观看| 在线观看免费不卡av| 国产成人亚洲综合a∨婷婷| 国产伦理在线观看| 97成人超碰视| 欧美激情 一区| 亚洲精品ww久久久久久p站 | 亚洲精品日日夜夜| 日本韩国欧美中文字幕| 欧美亚一区二区| 精品毛片一区二区三区| 亚洲视屏在线播放| av理论在线观看| 欧美洲成人男女午夜视频| 成人亚洲精品| 久久riav二区三区| 日韩亚洲一区在线| 日韩精品一区二区三区久久| 久久精品国产一区二区| caopor在线| 国产精品视频你懂的| 日韩乱码一区二区| 欧美人妖巨大在线| 巨骚激情综合| 久久久亚洲福利精品午夜| 嫩草伊人久久精品少妇av杨幂| 国产精品国产亚洲精品看不卡15| 中文字幕乱码在线观看| 国产精品国产三级国产三级人妇| 国产一级片免费看| 欧美日韩三级在线| 少妇人妻偷人精品一区二区| 久久99久国产精品黄毛片入口| 怡红院成人在线| 国产精品区一区二区三在线播放 | av大全在线免费看| 欧美精品精品精品精品免费| 依依综合在线| 国产综合动作在线观看| 综合一区av| av网址在线观看免费| 成人国产免费视频| 久久久久99精品成人片试看| 色婷婷av一区二区三区之一色屋| 五月婷婷丁香六月| 久久6精品影院| 456成人影院在线观看| 久久精品日韩| 伊人成人在线| 日韩精品在线播放视频| 亚洲视频一区二区在线| 在线观看免费黄色小视频| 日韩电影在线观看永久视频免费网站| cao在线视频| 91嫩草在线| 99久久综合| 樱花草www在线| 自拍av一区二区三区| 91在线你懂的| 中文字幕一区日韩电影| 久久91导航| 亚洲一区二区免费视频软件合集| 久久亚洲二区| 亚洲久久久久久久| 欧美午夜精品久久久久久孕妇 | 粉嫩蜜臀av国产精品网站| 欧美人妻精品一区二区三区| 日韩久久免费av| 欧美xxxxhdvideosex| 成人av免费在线看| 国内激情久久| 精品无码av一区二区三区| 亚洲在线中文字幕| www.黄色一片| 91精品国产九九九久久久亚洲| 欧美18xxxx| 日韩av手机版| 国产精品高潮呻吟久久| 国产又粗又猛又黄又爽无遮挡| 久久天天躁狠狠躁夜夜躁| 国产精品视频首页| 欧美在线观看视频免费| 99久久精品国产毛片| 久久亚洲精品国产| 亚洲欧美日韩精品久久亚洲区| 欧美91看片特黄aaaa| 亚洲欧洲日本国产| 国产精品一区二区久久精品爱涩| 精品无码m3u8在线观看| 亚洲国产精品电影| 国产激情久久| 在线播放 亚洲| 国产一区不卡视频| 亚洲GV成人无码久久精品| 亚洲人成在线播放| 国产精品久久久久久久无码| 亚洲国产人成综合网站| 四虎国产精品永远| 日本精品久久中文字幕佐佐木| 成人午夜国产| 无码av免费精品一区二区三区| 亚洲成人激情综合网|