前端程式員學好演算法系列(九)遞歸回溯演算法

来源:https://www.cnblogs.com/kbnet/archive/2020/07/28/13388607.html
-Advertisement-
Play Games

回溯演算法主要應用於樹形問題,我們先從一個簡單的演算法入手 17. 電話號碼的字母組合給定一個僅包含數字 2-9 的字元串,返回所有它能表示的字母組合。 給出數字到字母的映射如下(與電話按鍵相同)。註意 1 不對應任何字母。 示例: 輸入:"23" 輸出:["ad", "ae", "af", "bd", ...


回溯演算法主要應用於樹形問題,我們先從一個簡單的演算法入手

17. 電話號碼的字母組合
給定一個僅包含數字 2-9 的字元串,返回所有它能表示的字母組合。

給出數字到字母的映射如下(與電話按鍵相同)。註意 1 不對應任何字母。

 

示例:

輸入:"23"
輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

解題:

digits是數字字元串
s(digits) 是digits所能代表的字元串
s(digits[0..n-1])
  = letter(digits[0]) +s(digits[1...n-1])
  =letter(digits[0]) + letter(digits[1])  +s(digits[2...n-1])

 

1.我們建立一個map的數據結構,把鍵盤數字代表的字母一一傳入map中; map.get(digits[i])為當前傳入的第i個字元代表的字母集合

2. _generate() 我們傳入兩個變數 i 當前選擇的第幾個字母,str 預設傳入''
3. 當i的值等於digits.length是我們獲得了一個結果push到result中
4.迴圈當前的數字代表的字母 ,一一傳入_generate(i+1,str+tmp[r]);  遍歷其他結果

/**
 * @param {string} digits
 * @return {string[]}
 */
var letterCombinations = function(digits) {
     if(!digits){
        return [];
    }
    var len = digits.length;
    var map = new Map();
    map.set('1','');
    map.set('2','abc');
    map.set('3','def');
    map.set('4','ghi');
    map.set('5','jkl');
    map.set('6','mno');
    map.set('7','pqrs');
    map.set('8','tuv');
    map.set('9','wxyz');
    var result = [];
    function _generate(i,str){
        
        if(i == len){
            result.push(str);
            return;
        }
        var tmp = map.get(digits[i]);
        for(var r = 0;r<tmp.length;r++){
            _generate(i+1,str+tmp[r]);
        }
    }
    _generate(0,'');
    return result;
};

 

46. 全排列
給定一個 沒有重覆 數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]

 解題:
1.回溯標準解題模板res 存放結果的數組,tmpPath為傳入的數組,當 tmpPath.length == n是我們得到一個滿足條件的解,
2. !tmpPath.includes(nums[i]) 來過濾防止數組tmpPath存在重覆的值
3. tmpPath.push(nums[i]); 數組中加入值後,遞歸完成後,相應的值需要從數組中減去,tmpPath.pop()
4.數組為引用類型,防止取值錯誤我們取 tmpPath.slice()繼續遍歷
5.每次遍歷index+1 進行下次遍歷

/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function(nums) {
    let n = nums.length;
    let res = [];
    let tmpPath = [];
    let backtrack = (index,tmpPath) => {
        if(tmpPath.length == n){
            res.push(tmpPath);
            return;
        }
        for(let i = 0;i < n;i++){
            if(!tmpPath.includes(nums[i])){
                tmpPath.push(nums[i]);
                backtrack(index+1,tmpPath.slice());
                tmpPath.pop();
            }
        }
    }
    backtrack(0,tmpPath);
    return res;
  
}

 

77. 組合
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。

示例:

輸入: n = 4, k = 2
輸出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]

 

1.求解n,k,當前已經找到的組合儲存在res中,需要從start位置處開始搜索

2.could.length == k我們獲得了一個滿足條件的解

3. could.push(i)  could.pop() 每次我們加入的數據在遞歸結果前需要刪除掉
4.每次遞歸迴圈時從i的下一位開始找

/**
 * @param {number} n
 * @param {number} k
 * @return {number[][]}
 */
var combine = function(n, k) {
   
    var res = [];
    var could = [];
    if(k==0){
        return [[]]
    }
    function dfs(start,n,res,could){
        if(could.length == k){
            res.push(could.slice(0));
            return;
        }
        for(var i = start ; i<n+1;i++){
            could.push(i);
            dfs(i+1,n,res,could);
            could.pop()
        }
        return res;
    }
    return dfs(1,n,res,could)

};

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • DOM:Document/Object/Model DOM是一棵樹,樹上有Node,分為Document(html)、Element(元素)、Text(文本)、Comment(註釋)及其他 DOM最主要的功能是:通過 構造函數 把 節點 變成 對象,通過調用對象的 API 來操作對象 Node的介面 ...
  • 標簽語義化一含義 合適標簽做合適的事情,例如文章段落用p標簽,標題用h1-h6標簽 標簽語義化為瀏覽器和搜索引擎服務 標簽語乂化一為什麼要遵循標簽語義化 利於SE0優化(也就是搜索引擎的抓取,搜索引擎的爬蟲也依賴於標記來確定上下文和各個關鍵字的權重) 在樣式丟失的時候,還是可以比較好的呈現結構 更好 ...
  • 行內元素:a,button.big,em,i,input,mark,span,select,option,strog,b,sup,sub,textarea,u 內聯元素是指本身屬性為display:inline的元素.因為它自身的特點,我們通常使用行內元素來進行文字\小圖標(小結構)的搭建 塊級元素 ...
  • HTML元素指的是從開始標簽( start tag)到結束標簽( end tag)的所有代碼 開始標簽元素內容結束標簽 <p> this is a paragraph </p> <a href="default.htm"> this is a link </a> <br/> 註釋:開始標簽被稱為開放 ...
  • 60個\參考網址https://www.w3school.com.cn/tags/index.asp 標簽描述 <!--...--> 定義註釋。 <!DOCTYPE> 定義文檔類型。 <a> 定義錨。 <abbr> 定義縮寫。 <acronym> 定義只取首字母的縮寫。 <address> 定義文檔 ...
  • HTML:超文本標記語言,是使用標記標簽來描述網頁的一種語言,也是一種規範,一種標準,它通過標記符號來標記要顯示的網頁中的各個部分; css層疊樣式表是一種用來表現HTML(標準通用標記語言的一個應用)或XML(標準通用標記語言的一個子集)等文件樣式的的電腦語言。css不僅可以靜態地修飾網頁,還可 ...
  • HTML基本結構 document是指整個文件,它下麵就是咱們的html 超文本標記語言的結構包括"頭"(head)和主體(body) 其中"頭"部提供關於網頁的信息,"主體"部分提供網頁的具體內容 #HTML基本結構-文檔聲明 為了說明文檔使用的超文本標記原因標準,所有的超文本標記語言文檔應該以“ ...
  • 一夜無眠,學習不是為了別人,自己執行力好差,對自己過高期望,以為任務目標Soeasy,結果徘徊了幾個月,還是在原地踏步,怎麼講了?學習還是要腳踏實地,專註,不要為自己找藉口!畢竟虛長幾歲,曾經的年少輕狂高傲、曲動琴聲美妙一不復返!如今的自己在為曾經的不學習,努力向著生活買單!希望下麵可以越來越好! ...
一周排行
    -Advertisement-
    Play Games
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...