精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

一区二区在线观看视频| 狂野欧美一区| 亚洲第一视频在线观看| 日韩中文字幕三区| 国产一二三区在线| 国产在线不卡一卡二卡三卡四卡| 欧美国产视频一区二区| 免费成人深夜夜行p站| 最新日韩一区| 亚洲一区二区在线观看视频| 欧美视频小说| 亚洲成人av综合| 日本亚洲一区二区| 国内精品视频一区| 国产日产精品一区二区三区的介绍| 日韩欧美中文在线观看| 在线一区二区三区| 久久人人爽人人爽人人av| 成人在线免费观看| av在线播放成人| 成人性教育视频在线观看| 成年人免费高清视频| 911久久香蕉国产线看观看| 日韩电影第一页| 日日干夜夜操s8| 亚洲欧美电影| 夜色激情一区二区| 天天人人精品| 日韩电影网址| 成人精品一区二区三区中文字幕| 国产在线观看一区二区三区| av网站中文字幕| 亚洲国产1区| 超碰91人人草人人干| 免费黄色在线网址| 国内精品久久久久久99蜜桃| 日韩电影第一页| 国产xxxx视频| 高清欧美性猛交xxxx黑人猛| 777xxx欧美| 777一区二区| 日本精品另类| 在线观看成人免费视频| 波多野结衣50连登视频| 成入视频在线观看| 亚洲国产精品久久人人爱 | 精品国产av 无码一区二区三区| 视频一区二区不卡| 欧美专区在线观看| 99久热在线精品996热是什么| 红桃视频国产精品| 久久99国产精品久久久久久久久| 精品少妇一区二区三区密爱| 欧美日韩激情| 在线电影av不卡网址| 免费一级特黄3大片视频| 国产一区二区三区四区| 国产香蕉97碰碰久久人人| 国产精品毛片一区二区| 九九久久成人| 国产亚洲欧洲黄色| 日本午夜精品视频| 99久久夜色精品国产亚洲狼| 久久精品国产欧美激情| 动漫性做爰视频| 国产精品黄色| 97视频在线观看免费| 亚洲 欧美 日韩 综合| 国产农村妇女毛片精品久久莱园子 | 91嫩草在线视频| www.亚洲欧美| 成人av免费网站| 欧美激情一区二区三区在线视频 | 91在线视频观看| 欧洲久久久久久| 1024视频在线| 亚洲黄色av一区| 日韩中文字幕在线视频观看| 国模套图日韩精品一区二区| 欧美日韩在线三级| 国产精品熟女一区二区不卡| 欧美大奶一区二区| 在线观看日韩视频| 欧美日韩精品在线观看视频| 91久久中文| 国产精品视频一| 成人午夜免费在线观看| 91麻豆精品秘密| 中文精品视频一区二区在线观看| 宅男在线观看免费高清网站| 欧美日韩国产精品| 亚洲久久中文字幕| 综合中文字幕| 伊人亚洲福利一区二区三区| 中文字幕av播放| 国产日韩视频| 成人信息集中地欧美| 五月婷婷在线观看视频| 国产精品网曝门| 可以看毛片的网址| 国产精品久久久久77777丨| 日韩欧美国产wwwww| 在哪里可以看毛片| 欧美日本三区| 国产精品热视频| 亚洲老妇色熟女老太| 欧美国产97人人爽人人喊| 人妻激情另类乱人伦人妻| 欧美成人精品三级网站| 欧美成人一区二区三区片免费| 日本一区二区三区网站| 欧美精品91| 国产欧美日韩精品丝袜高跟鞋| 日本高清视频www| 亚洲三级在线免费观看| 日日摸天天爽天天爽视频| 国模大尺度视频一区二区| 亚洲女人天堂网| 久久精品99久久久久久| 青椒成人免费视频| 美媛馆国产精品一区二区| 免费污视频在线观看| 欧美精品tushy高清| 一本色道综合久久欧美日韩精品| 亚洲视频电影在线| 国产精品视频久久| 成人av毛片| 一本大道久久精品懂色aⅴ| 肉丝美足丝袜一区二区三区四| 97精品视频在线看| 国产精品成人aaaaa网站| 先锋av资源站| 亚洲va国产天堂va久久en| 中国黄色片一级| 97久久夜色精品国产| 国产精品极品美女粉嫩高清在线| 亚洲日本在线播放| 亚洲mv在线观看| 一级欧美一级日韩片| 在线免费高清一区二区三区| 成人免费观看网站| 天天色天天射天天综合网| 91精品欧美福利在线观看| 成人欧美一区二区三区黑人一 | 色综合天天综合狠狠| 国产草草浮力影院| 亚洲高清不卡| 国外成人免费视频| 国产ktv在线视频| 日韩av网站电影| 毛片基地在线观看| 91在线播放网址| 欧美s码亚洲码精品m码| 日韩美女精品| 日韩av电影国产| 国模精品一区二区| 欧美网站一区二区| 欧美一区二区三区观看| 久久99精品久久久久久动态图| 亚洲一区二区三区免费看| 日韩国产大片| 欧美巨乳美女视频| 丁香花免费高清完整在线播放 | 中文字幕精品在线观看| 国产精品二三区| 色18美女社区| 黄色成人在线网址| 精品无人区一区二区三区| av综合电影网站| 色悠悠久久88| 亚洲AV无码一区二区三区少妇| 亚洲丰满少妇videoshd| 黄色在线观看av| 免费人成在线不卡| 特级黄色录像片| 国产精品色在线网站| 欧美亚洲午夜视频在线观看| 狠狠色伊人亚洲综合网站l| 欧美日韩国产一级片| 九九热视频精品| 久久这里只有精品首页| 亚洲欧美偷拍另类| 国产精品va| 欧洲国产精品| 涩爱av色老久久精品偷偷鲁 | 国产99久久久久久免费看| 国产精品欧美一级免费| 色婷婷狠狠18禁久久| 亚洲免费网址| 天堂av免费看| 亚洲妇女av| 91精品啪在线观看麻豆免费 | 欧美日韩在线一区| 激情高潮到大叫狂喷水| 成人午夜大片免费观看| 成人免费毛片播放| 欧美久久一级| 欧洲一区二区日韩在线视频观看免费 | 欧洲天堂在线观看| 91精品国产91久久综合桃花 | 欧美日韩国产bt| 国产主播在线观看| 中文字幕亚洲一区二区va在线| 涩视频在线观看| 麻豆91小视频| 欧美视频在线播放一区| 91精品福利| 日韩福利影院| 精品视频在线你懂得| 91精品久久久久久久久青青| 男人的天堂免费在线视频| www国产91| 九九九伊在人线综合| 日韩午夜在线观看| 亚洲图片欧美在线| 欧美日韩中文字幕| 国产在线视频在线观看| 亚洲欧洲成人自拍| 干b视频在线观看| av影院午夜一区| 超碰人人cao| 蜜臀精品久久久久久蜜臀| 国产综合中文字幕| 在线精品小视频| 一区视频二区视频| 国产精品一在线观看| 国产精品免费区二区三区观看| 日韩黄色碟片| 国产精品一区久久久| 中文字幕在线视频网站| 国内偷自视频区视频综合| 超碰在线caoporn| 国产亚洲视频在线观看| 男女网站在线观看| 日韩福利视频在线观看| 黄色aaa毛片| 日韩欧美电影在线| 99热这里只有精品在线观看| 欧美性高清videossexo| 一级特黄免费视频| 色一情一乱一乱一91av| 国产午夜精品久久久久| 精品久久久久久中文字幕| 精品无码人妻一区二区三| 有码一区二区三区| 免费毛片在线播放免费| 一区二区三区四区视频精品免费| 国产一区二区精彩视频| 1024成人网| 日日噜噜夜夜狠狠久久波多野| 亚洲欧洲日本在线| 亚洲色偷偷综合亚洲av伊人| 中文字幕一区二区在线播放| 91制片厂在线| 亚洲天堂免费在线观看视频| 男人在线观看视频| 日韩一区日韩二区| 国产高潮国产高潮久久久91| 亚洲日本一区二区三区| 希岛爱理中文字幕| 亚洲一二三区在线观看| 国产午夜小视频| 一本大道av伊人久久综合| 免费无码国产精品| 欧美日韩国产中文| 亚洲国产成人在线观看| 亚洲精品久久在线| 九一在线视频| 最近中文字幕日韩精品| a在线免费观看| 久久久久久成人| 韩漫成人漫画| 国产主播欧美精品| 日韩在线视频一区二区三区| 精品久久久久久亚洲| 免费av一区二区三区四区| 先锋影音网一区| 欧美激情第10页| 黑人糟蹋人妻hd中文字幕| 日韩精品成人一区二区在线| 爱豆国产剧免费观看大全剧苏畅| 国产成人一级电影| 人妻少妇精品视频一区二区三区| 欧美激情一区二区| 欧美成人免费观看视频| 欧美性猛交xxxx| 国产裸体永久免费无遮挡| 亚洲电影中文字幕| 国产大片在线免费观看| 欧美男插女视频| 久九九久频精品短视频| 91精品久久久久久久久久| 久久精品色播| 国产91av视频在线观看| 亚洲精品专区| 女人高潮一级片| 99视频有精品| 人人澡人人澡人人看| 日韩欧美国产视频| 国产人妖一区二区| 亚洲三级免费看| 欧美6一10sex性hd| 国产欧美精品久久久| 日韩黄色网络| 日本高清xxxx| 日韩黄色在线观看| 毛茸茸free性熟hd| 中文字幕亚洲一区二区av在线| 日韩视频在线观看一区| 日韩一级精品视频在线观看| 黄色软件在线| 久久久人成影片一区二区三区观看| 午夜无码国产理论在线| 国产综合色一区二区三区| **女人18毛片一区二区| 欧美激情精品久久久久久小说| 国产传媒久久文化传媒| 国产jizz18女人高潮| 日韩欧美一区二区三区久久| 成人av一区二区三区在线观看| 中文字幕精品久久| 一区二区电影免费观看| 国产精品日韩欧美一区二区| 91久久久精品国产| 欧美特级aaa| 久久精品视频一区二区三区| 国产精品变态另类虐交| 91精品免费在线| 国产黄色在线网站| 国产欧美一区二区| 欧美精品色图| 北条麻妃av高潮尖叫在线观看| 91麻豆国产香蕉久久精品| 久久精品免费av| 日韩欧美国产电影| 欧美卡一卡二| 成人欧美视频在线| 欧美精品午夜| 亚洲AV成人精品| 一区二区国产视频| 国产激情视频在线播放| 久久亚洲影音av资源网| 成人在线啊v| 最近中文字幕免费mv| 国产真实乱子伦精品视频| 婷婷伊人五月天| 日韩精品一区二区三区视频| 中日韩高清电影网| 国产传媒一区二区三区| 精品91视频| 手机在线成人av| 黄网站色欧美视频| 日韩大胆人体| 国产精品久久97| 成人一区不卡| 一级片黄色免费| 一区二区三区色| 免费看av毛片| 韩国精品美女www爽爽爽视频| 牛牛视频精品一区二区不卡| 欧美日韩黄色一级片| 91首页免费视频| 自拍偷拍第八页| 久久精品美女视频网站| 日韩成人视屏| 国产中文字幕视频在线观看| 久久久综合视频| 中文字幕第31页| 久久香蕉国产线看观看av| 91成人短视频| www.com毛片| 中文字幕va一区二区三区| 国产又黄又粗又长| 欧美激情xxxx| 中国av一区| 最新免费av网址| 亚洲尤物视频在线| 日本一卡二卡四卡精品| 国产精品一区av| 国产精品观看| 欧美黄色一级生活片| 91精品国产欧美一区二区| segui88久久综合9999| 日本在线播放一区| 国产精品一区二区三区乱码| 97超碰人人干| 日韩中文字幕网| 国产精品自在线拍| 中文字幕国产传媒| 一区二区三区在线视频播放| 深夜福利视频一区| 成人免费福利在线| 日韩午夜免费| 91n在线视频| 亚洲精品一区在线观看香蕉| 欧美男男gaygay1069| 欧美二区在线视频| 亚洲三级视频在线观看| 三级毛片在线免费看| 亚洲最大福利网|