国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

回溯理論基礎及l(fā)eetcode例題

這篇具有很好參考價值的文章主要介紹了回溯理論基礎及l(fā)eetcode例題。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

學習參考

回溯

與遞歸相輔相成;回溯是遞歸的副產品,只要有遞歸就會有回溯。
回溯函數(shù)也就是遞歸函數(shù),指的都是一個函數(shù)。

回溯搜索法

純暴力搜索
解決的問題

組合問題:N個數(shù)里面按一定規(guī)則找出k個數(shù)的集合
切割問題:一個字符串按一定規(guī)則有幾種切割方式
子集問題:一個N個數(shù)的集合里有多少符合條件的子集
排列問題:N個數(shù)按一定規(guī)則全排列,有幾種排列方式(與組合差別,排列有元素順序)
棋盤問題:N皇后,解數(shù)獨等等

理解

抽象的不易理解;抽象為圖形結構--樹形結構
N叉樹【樹的寬度:集合的大?。╢or處理);深度:遞歸的深度(遞歸處理)】

模板

void backtracking(參數(shù)){
  if(終止條件){
    收集結果;
    return;
  }

  //單層搜索
   for(選擇:本層集合中元素(樹中節(jié)點孩子的數(shù)量就是集合的大小)){//集合元素集
      處理節(jié)點;
      backtracking(路徑,選擇列表);//遞歸函數(shù);
      回溯操作; //(12,把2回溯,變13;沒有回溯操作就會遞歸為123)
    }
  return;
}

遞歸里面嵌套for循環(huán),for循環(huán)里又有遞歸

leetcode題目

組合

77.組合

for循環(huán)嵌套太多層了

樹形結構
回溯理論基礎及l(fā)eetcode例題
不能取前面的的:因為組合是無序的,會重復;
每個節(jié)點都是一個for循環(huán)

回溯三部曲

遞歸函數(shù)參數(shù)返回值
確定終止條件
單層遞歸邏輯

偽代碼

全局變量:二維數(shù)組res【返回值】
         一維數(shù)組path【單個結果】
//確定返回值參數(shù)
void backtracking(n,k,start){//n集合大小;k需要的子集合大?。籹tart每個取值的開始;
  //確定終止條件
  if(path.size == k){
    res.add(path);
    return;
  }
  //單層遞歸邏輯
  //對于1,234節(jié)點
  for(i=start,i<=n;i++){
    path.push(i);//1
    backtracking(n,k,i+1);//遍歷剩下的集合234;
    path.pop();//回溯過程
  } 
}

實現(xiàn)
java版本

class Solution {
    List<List<Integer>> res = new ArrayList<List<Integer>>();
    List<Integer> path = new ArrayList<Integer>();

    public List<List<Integer>> combine(int n, int k) {
        backtracking(n,k,1);
        return res;
    }

    public void backtracking(int n,int k,int start){
        if(path.size() == k){
            res.add(new ArrayList<>(path));//容易犯錯誤
            return;
        }

        for(int i=start;i<=n;i++){//i<=n -(k-path.size()) + 1 會減少運行時間【剪枝操作】
            path.add(i);
            backtracking(n,k,i+1);
            path.remove(path.size()-1);
        }
        
    }
}

問題:參考
在鏈表path里面添加值,然后把path鏈表添加進res鏈表中,在做算法題的時候,平時使用res.add(path),結果發(fā)現(xiàn)輸出打印為空:

在鏈表path里面添加值,然后把path鏈表添加進res鏈表中,在做算法題的時候,平時使用res.add(path),結果發(fā)現(xiàn)輸出打印為空: res.add(new ArrayList<>(path))和res.add(path)的區(qū)別
共同點: 都是向res這個ArrayList中填加了一個名為path的鏈表
不同點: res.add(new ArrayList(path)):開辟一個獨立地址,地址中存放的內容為path鏈表,后續(xù)path的變化不會影響到res
res.add(path):將res尾部指向了path地址,后續(xù)path內容的變化會導致res的變化。

優(yōu)化:剪枝
可以剪枝的地方就在遞歸中每一層的for循環(huán)所選擇的起始位置。

如果for循環(huán)選擇的起始位置之后的元素個數(shù) 已經不足 我們需要的元素個數(shù)了,那么就沒有必要搜索了。

回溯理論基礎及l(fā)eetcode例題
優(yōu)化過程如下:

已經選擇的元素個數(shù):path.size();
所需需要的元素個數(shù)為: k - path.size();
列表中剩余元素(n-i) >= 所需需要的元素個數(shù)(k - path.size())
在集合n中至多要從該起始位置 : i <= n - (k - path.size()) + 1,開始遍歷

分割

131. 分割回文串

樹形結構
回溯理論基礎及l(fā)eetcode例題

回溯三部曲

遞歸函數(shù)參數(shù)返回值
確定終止條件
單層遞歸邏輯

偽代碼
收集結果路徑

void backtracking(string s,startIndex){
    //終止條件
    //即切割線是終止條件
    if(startIndex >= s.length()){
        res.add(path);
        return;
    }

    //單層遞歸邏輯
    //切割字串范圍:(startIndex,i]
    for(i=startIndex;i< s.length();i++){
      if(isPalindrome(s,startIndex,i)){
          path.add(子串);
      }else continue;
      
      backtracking(s,i+1);
      path.remove(path.size()-1);
    }
}

實現(xiàn)

java版本

class Solution {
    List<List<String>> result = new ArrayList<List<String>>();
    List<String> path = new ArrayList<String>();

    public List<List<String>> partition(String s) {
        backtracking(s,0);
        return result;
    }

    public void backtracking(String s,int startIndex){
        if(startIndex >= s.length()){
            result.add(new ArrayList<String>(path));
            return;
        }

        for(int i=startIndex;i<s.length();i++){
            String sub = s.substring(startIndex,i+1);
            if(isPalindrome(sub)){
                path.add(sub);
            }else {continue;}

            backtracking(s,i+1);
            path.remove(path.size()-1);
        }
    }

    public boolean isPalindrome(String s){
        int left = 0;
        int right = s.length()-1;

        while(left<right){
            if(s.charAt(left) != s.charAt(right)){
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

子集問題

78. 子集

樹形結構
回溯理論基礎及l(fā)eetcode例題
收獲結果的時候:在每個節(jié)點收獲結果
組合和分割問題都是在葉子節(jié)點里取結果;
偽代碼

void backtracking(nums,stratIndex){
  result.add(path);

  if(stratIndex >= path.size()) return;

  for(int i=startIndex;i<nums.length;i++){
    path.add(nums[i]);
    backtracking(nums,i+1);
    path.remove(path.size()-1);
  }
}

實現(xiàn)

class Solution {
    List<List<Integer>> list = new ArrayList<List<Integer>>();
    List<Integer> path= new ArrayList<Integer>();
    public List<List<Integer>> subsets(int[] nums) {
        backtracking(nums,0);
        return list;
    }

    public void backtracking(int[] nums,int stratIndex){
        list.add(new ArrayList<Integer>(path));
        if(stratIndex>=nums.length){
            return;
        }

        for(int i=stratIndex;i<nums.length;i++){
            path.add(nums[i]);
            backtracking(nums,i+1);
            path.remove(path.size()-1);
        }
    }
} 

排列

46.全排列

樹形結構
回溯理論基礎及l(fā)eetcode例題

偽代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-412147.html

void backtracking(nums,used){
  if(path.size() == nums.length){
    res.add(path);
    return;
  }

  for(i=0;i<nums.length;i++){
    if(used[i] == true) continue;
    used[i] = true;
    path.add(nums[i]);
    backtracking(nums,used);
    used[i] = false;
    path.remove(path.size()-1);
  }
}

實現(xiàn)

class Solution {
    List<List<Integer>> list = new ArrayList<List<Integer>>();
    List<Integer> path = new ArrayList<Integer>();

    public List<List<Integer>> permute(int[] nums) {
        boolean[] used = new boolean[nums.length];
        backtracking(nums,used);
        return list;
    }

    public void backtracking(int[] nums,boolean[] used){
        if(path.size() >= nums.length){
            list.add(new ArrayList<>(path));
            return;
        }

        for(int i=0;i<nums.length;i++){
            if(used[i] == true) continue;
            
            path.add(nums[i]);
            used[i] = true;
            backtracking(nums,used);
            path.remove(path.size()-1);
            used[i] = false;
        }
    }
}

到了這里,關于回溯理論基礎及l(fā)eetcode例題的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 回溯遞歸(例題+思路+代碼)

    回溯遞歸(例題+思路+代碼)

    leetcode 77 組合問題適合用回溯求解。 經典解法:for循環(huán) + 內部回溯。 每次進入回溯方法時,先判斷終止條件,再進行當前層的循環(huán),循環(huán)進行下一層遞歸。 由于遞歸本質其實就是暴力解法,所以會經過許多沒有必要的節(jié)點。 該題中,如果n=4,k=3,那么在第二層中的3和4都是

    2023年04月19日
    瀏覽(82)
  • 回溯算法例題(剪枝策略)

    回溯算法例題(剪枝策略)

    鏈接: 77. 組合 鏈接: 216. 組合總和 III 鏈接: 17. 電話號碼的字母組合 鏈接: 39. 組合總和 注:使用剪枝必須對原數(shù)組進行排序 鏈接: 40. 組合總和 II 鏈接: 131. 分割回文串 鏈接: 93. 復原 IP 地址 鏈接: 78. 子集 鏈接: 90. 子集 II 鏈接: 46. 全排列 鏈接: 47. 全排列 II 鏈接: 51. N 皇后 鏈接

    2024年02月04日
    瀏覽(82)
  • 遞歸回溯兩個例題:1.數(shù)組組合 2.在矩陣中搜索單詞

    遞歸回溯兩個例題:1.數(shù)組組合 2.在矩陣中搜索單詞

    題目1:組合 給定兩個整數(shù) n 和 k ,返回范圍 [1, n] 中所有可能的 k 個數(shù)的組合。 你可以按 任何順序 返回答案。 輸入:n = 4, k = 2 輸出: [ ? [2,4], ? [3,4], ? [2,3], ? [1,2], ? [1,3], ? [1,4], ] ?解題思路: 1.定義一個temp數(shù)組,存放臨時的組合結果 2.兩種選擇:1.選擇當前元素2.不選

    2024年02月15日
    瀏覽(21)
  • 代碼隨想錄第三天|鏈表理論基礎,LeetCode203.移除鏈表元素, LeetCode707.設計鏈表,LeetCode 206.反轉鏈表

    代碼隨想錄第三天|鏈表理論基礎,LeetCode203.移除鏈表元素, LeetCode707.設計鏈表,LeetCode 206.反轉鏈表

    鏈表: 鏈表是一種通過指針串聯(lián)在一起的線性結構,每一個節(jié)點由兩部分組成,一個是數(shù)據(jù)域一個是指針域(存放指向下一個節(jié)點的指針),最后一個節(jié)點的指針域指向null(空指針的意思)。 鏈表的入口節(jié)點稱為鏈表的頭結點也就是head。 鏈表類型: 1.單鏈表 單鏈表中的指

    2024年02月11日
    瀏覽(27)
  • 整數(shù)規(guī)劃、對偶理論、線性規(guī)劃經典例題講解

    整數(shù)規(guī)劃、對偶理論、線性規(guī)劃經典例題講解

    整數(shù)規(guī)劃是一類要求問題的解中的全部或一部分變量為整數(shù)的數(shù)學規(guī)劃,應用范圍極其廣泛。不僅在工業(yè)和工程設計和科學研究方面有許多應用,而且在計算機設計、系統(tǒng)可靠性和經濟分析等方面也有新的應用。 通過前面的學習,我們已經掌握了整數(shù)規(guī)劃的數(shù)學模型、割平面

    2024年02月05日
    瀏覽(19)
  • 算法訓練day31貪心算法理論基礎Leetcode455分發(fā)餅干376擺動序列53最大子序和

    文章鏈接 代碼隨想錄 (programmercarl.com) 說實話貪心算法并沒有固定的套路 。 最好用的策略就是舉反例,如果想不到反例,那么就試一試貪心吧 。 面試中基本不會讓面試者現(xiàn)場證明貪心的合理性,代碼寫出來跑過測試用例即可,或者自己能自圓其說理由就行了 。 刷題或者面

    2024年02月20日
    瀏覽(20)
  • 區(qū)間合并(超詳細逐步講解/例題/思路分析/參考代碼)

    區(qū)間合并(超詳細逐步講解/例題/思路分析/參考代碼)

    我們要了解區(qū)間合并是什么,首先來看這樣的一個例子。 區(qū)間2是區(qū)間1的一個子區(qū)間 區(qū)間3和區(qū)間1有交集 區(qū)間4和區(qū)間1端點在同一個點上 區(qū)間5和區(qū)間1沒有交集 所以區(qū)間2,3,4都可以和區(qū)間1合并形成一個新的區(qū)間,區(qū)間5則不行。 總結:區(qū)間合并就是把多個區(qū)間有交集的部分

    2024年02月14日
    瀏覽(25)
  • 代碼隨想錄第6天| 哈希表理論基礎 ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

    代碼隨想錄第6天| 哈希表理論基礎 ,LeetCode242.有效的字母異位詞,LeetCode349. 兩個數(shù)組的交集,LeetCode202. 快樂數(shù),LeetCode1. 兩數(shù)之和

    哈希表(散列表)理論基礎 : 哈希表是根據(jù)關鍵碼的值而直接進行訪問的數(shù)據(jù)結構。 直白來講其實數(shù)組就是一張哈希表。 ? 什么時候想到用哈希法, 當我們遇到了要快速判斷一個元素是否出現(xiàn)集合里的時候,就要考慮哈希法 。 當我們遇到了要快速判斷一個元素是否出現(xiàn)集

    2024年02月10日
    瀏覽(91)
  • AUTOSAR - CANTP - 學習一 :理論基礎

    目錄 1、概述 2、名詞縮寫 2.1、前綴含義 2.2、協(xié)議數(shù)據(jù)縮寫 3、幀類別

    2024年02月03日
    瀏覽(16)
  • fMRI基礎理論知識學習

    fMRI基礎理論知識學習

    時隔多年,再次上線,重新經營csdn。自讀研以來,不是干飯就是擺爛,實在頹廢,能重新開始寫博客,已然不易。在這里立下flag,爭取以后每周都能寫點什么東西,一來鍛煉文筆,二來記錄學習歷程 我的研究方向與功能磁共振成像fMRI有關,此前從未接觸過該領域,完全是從

    2024年02月09日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包