代碼隨想錄算法訓練營第三十天| 回溯篇總結

文章目錄

  • 前言
  • 一、組合問題
  • 二、切割問題
  • 三、子集問題
  • 四、排列問題
  • 五、性能分析
  • 總結


前言

回溯法就是暴力搜索,并不是什么高效的算法,最多再剪枝一下。

組合問題:N個數里面按一定規則找出k個數的集合
排列問題:N個數按一定規則全排列,有幾種排列方式
切割問題:一個字符串按一定規則有幾種切割方式
子集問題:一個N個數的集合里有多少符合條件的子集
棋盤問題:N皇后,解數獨等等


提示:以下是本篇文章正文內容,下面案例可供參考

一、組合問題

給定兩個整數 nk,返回范圍 [1, n] 中所有可能的 k 個數的組合。
你可以按任意順序返回答案。

示例

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

通過for循環橫向遍歷,遞歸縱向遍歷,回溯不斷調整結果集

示例:pandas 是基于NumPy 的一種工具,該工具是為了解決數據分析任務而創建的。

對于組合問題,什么時候需要startIndex,也需要考慮
如果是一個集合來求組合的話,就需要startIndex 216.組合總和III 、第77題. 組合
如果是多個集合求組和,各集合互相不影響,就不要startIndex17.電話號碼的字母組合

去重問題,樹枝去重樹層去重,這里使用了used容器記錄遍歷情況。
used[i - 1] == true,說明同一樹枝該相同元素被使用過
used[i - 1] == false,說明同一樹層該相同袁術被使用過

在這里插入圖片描述

二、切割問題

有如下幾個難點:

  • 如何模擬切割線
  • 切割問題中遞歸如何終止
  • 在遞歸循環中如何截取子串
  • 如何判斷回文

131.分割回文串
遞歸用來縱向遍歷,for循環用來橫向遍歷,切割線(就是圖中的紅線)切割到字符串的結尾位置,說明找到了一個切割方法。

在這里插入圖片描述

截取字符串
for (int i = startIndex; i < s.size(); i++)循環中,我們 定義了起始位置startIndex,那么 [startIndex, i] 就是要截取的子串。

for (int i = startIndex; i < s.size(); i++) {if (isPalindrome(s, startIndex, i)) { // 是回文子串// 獲取[startIndex,i]在s中的子串string str = s.substr(startIndex, i - startIndex + 1);path.push_back(str);} else {                // 如果不是則直接跳過continue;}backtracking(s, i + 1); // 尋找i+1為起始位置的子串path.pop_back();        // 回溯過程,彈出本次已經添加的子串
}

三、子集問題

在樹形結構中子集問題是要收集所有節點的結果,而組合問題是收集葉子節點的結果。

四、排列問題

排列是有序的,也就是說 [1,2] 和 [2,1] 是兩個集合,這和之前分析的子集以及組合所不同的地方。所以處理排列問題就不用使用startIndex了。
在這里插入圖片描述
排列樹層上去重(used[i - 1] == false),樹枝上去重(used[i - 1] == true)

五、性能分析

子集問題分析:

  • 時間復雜度:O(2n),因為每一個元素的狀態無外乎取與不取,所以時間復雜度為O(2n)。
  • 空間復雜度:O(n),遞歸深度為n,所以系統棧所用空間為O(n)。每一層遞歸所用的空間都是常數級別。注意代碼里的resultpath都是全局變量,就算是放在參數里,傳的也是引用,并不會新申請內存空間,最終空間復雜度為O(n)。

排列問題分析:

  • 時間復雜度:O(n!),這個可以從排列的樹形圖中很明顯發現,每一層節點為n,第二層每一個分支都延伸了n-1個分支,再往下又是n-2個分支,所以一直到葉子節點一共就是 n * (n-1) * (n-2) * … * 1 = n!。
  • 空間復雜度:O(n),和子集問題同理。

組合問題分析:

  • 時間復雜度:O(2^n),組合問題其實就是一種子集的問題,所以組合問題最壞的情況,也不會超過子集問題的時間復雜度。
  • 空間復雜度:O(n),和子集問題同理。

N皇后問題分析:

  • 時間復雜度:O(n!),其實如果看樹形圖的話,直覺上是O(n^n),但皇后之間不能見面所以在搜索的過程中是有剪枝的,最差也就是O(n!),n!表示n * (n-1) * … * 1。
  • 空間復雜度:O(n),和子集問題同理。

總結

提示:這里對文章進行總結:
例如:以上就是今天要講的內容,本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數據的函數和方法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/716857.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716857.shtml
英文地址,請注明出處:http://en.pswp.cn/news/716857.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【黑馬程序員】STL之set和map容器

文章目錄 set/multiset容器set基本概念簡介區別 set的構造和賦值功能描述函數原型代碼示例運行結果 set的大小和交換功能描述函數原型代碼示例運行結果 set的插入和刪除功能描述函數原型代碼示例運行結果 set查找和統計函數原型代碼示例運行結果 set和multiset區別區別代碼示例…

JVM(6)

JMM JVM定義了一種Java內存模型來屏蔽掉各種硬件和操作系統的內存訪問差異,以實現讓Java程序在各種平臺下都能達到一致的內存訪問效果.在此之前,C/C直接使用物理硬件和操作系統的內存模型,因此,會由于不同平臺下的內存模型差異,有可能導致程序在一套平臺上并發完全正常,而在另…

深入解剖指針(4)

個人主頁&#xff08;找往期文章包括但不限于本期文章中不懂的知識點&#xff09;&#xff1a; 我要學編程(?_?)-CSDN博客 目錄 回調函數 qsort使用舉例 使用qsort函數排序整型數據 使用qsort排序結構數據 qsort函數的模擬實現 回調函數 回調函數就是一個通過函數指…

【Android12】Android性能調優工具SystemServerTiming日志

Android性能調優工具SystemServerTiming日志 性能優化、穩定性優化是Android系統優化的兩大方面&#xff0c;對于性能調試Android提供了很多工具&#xff0c;比如&#xff1a;bootchart、systrace、perfboot、log、dmsg等等。 SystemServerTiming是Android原生系統中一個日志…

《Spring Security 簡易速速上手小冊》第10章 未來趨勢與高級話題(2024 最新版)

文章目錄 10.1 云原生安全性趨勢10.1.1 基礎知識10.1.2 重點案例&#xff1a;保護微服務通信10.1.3 拓展案例 1&#xff1a;容器安全最佳實踐10.1.4 拓展案例 2&#xff1a;自動化安全審計和合規性檢查 10.2 反應式編程與 Spring Security10.2.1 基礎知識10.2.2 重點案例&#…

nginx-圖片模塊

./configure --with-http_image_filter_module location / {root html;index index.html index.htm;if ($arg_w "") {set $arg_w -;}if ($arg_h "") {set $arg_h -;}image_filter resize $arg_w $arg_h;image_filter_jpeg_quality 95; } 訪問: 1234…

CSS錐形漸變:conic-gradient()

畫一個扇形圖&#xff0c;使用常規方法可能很難畫&#xff0c;但是用錐形漸變的話非常好畫 <style>.pattern{width: 100px; height: 100px;border-radius: 50%;background: conic-gradient(yellow 30deg , black 30deg , black 90deg , yellow 90deg ,yellow 150d…

Git分布式版本控制系統——git學習準備工作

一、Git倉庫介紹 開發者可以通過Git倉庫來存儲和管理文件代碼&#xff0c;Git倉庫分為兩種&#xff1a; 本地倉庫&#xff1a;開發人員自己電腦上的Git倉庫 遠程倉庫&#xff1a;遠程服務器上的Git倉庫 倉庫之間的運轉如下圖&#xff1a; commit&#xff1a;提交&#xff…

Decoupled Knowledge Distillation解耦知識蒸餾

Decoupled Knowledge Distillation解耦知識蒸餾 現有的蒸餾方法主要是基于從中間層提取深層特征&#xff0c;而忽略了Logit蒸餾的重要性。為了給logit蒸餾研究提供一個新的視角&#xff0c;我們將經典的KD損失重新表述為兩部分&#xff0c;即目標類知識蒸餾&#xff08;TCKD&a…

c++之旅——第四彈

大家好啊&#xff0c;這里是c之旅第三彈&#xff0c;跟隨我的步伐來開始這一篇的學習吧&#xff01; 如果有知識性錯誤&#xff0c;歡迎各位指正&#xff01;&#xff01;一起加油&#xff01;&#xff01; 創作不易&#xff0c;希望大家多多支持哦&#xff01; 本篇文章的主…

如何對比 MySQL 主備數據的一致性?

隨著業務范圍的擴大&#xff0c;很多企業為了保障核心業務的高可用性&#xff0c;選擇了 MySQL 主從架構&#xff0c;這一套方案通常具備主備數據同步、數據備份與恢復、讀寫分離、高可用切換等特性&#xff0c;是一種相當成熟可靠的數據庫架構方案。然而這套方案在特定情況下可…

Redis小白入門教程

Redis入門教程 1. Redis入門1.1 Redis簡介1.2 Redis服務啟動與停止1.2.1 Redis下載1.2.2 服務啟動命令1.2.3 客戶端連接命令1.2.4 修改Redis配置文件 2. Redis數據類型2.1 五種常用數據類型介紹2.1.1 字符串操作命令2.1.2 哈希操作命令2.1.3 列表操作命令2.1.4 集合操作命令2.1…

雙周回顧#006 - 這三個月

斷更啦~~ 上次更新時間 2023/11/23, 斷更近三個月的時間。 先狡辯下&#xff0c;因為忙、著實忙。因為忙&#xff0c;心安理得給斷更找了個借口&#xff0c;批評下自己~~ 這三個月在做啥&#xff1f;跨部門援助&#xff0c;支援公司互聯網的 ToC 項目&#xff0c;一言難盡。 …

智能時代:人工智能引領未來創新

智能時代&#xff1a;人工智能引領未來創新 1. 人工智能的定義與特點 人工智能&#xff08;Artificial Intelligence&#xff0c;AI&#xff09;是指模擬、延伸和擴展人類智能的理論、方法、技術及應用系統的一門交叉學科。其特點包括學習能力、推理能力、感知能力和交互能力…

【C語言】InfiniBand 驅動mlx4_ib_init和mlx4_ib_cleanup

一、中文講解 這兩個函數是Linux內核模塊中對于Mellanox InfiniBand 驅動程序初始化和清理的函數。 mlx4_ib_init()函數是模塊初始化函數&#xff0c;使用__init宏標注&#xff0c;表示該函數只在模塊加載時運行一次。 函數執行的步驟如下&#xff1a; 1. 通過alloc_ordered_w…

數據結構——lesson5棧和隊列詳解

hellohello~這里是土土數據結構學習筆記&#x1f973;&#x1f973; &#x1f4a5;個人主頁&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所屬專欄&#xff1a;數據結構學習筆記 &#x1f4a5;對于順序表鏈表有疑問的都可以在上面數據結構的專欄進行學習哦~感謝大家的觀看與…

ElasticSearch開篇

1.ElasticSearch簡介 1.1 ElasticSearch&#xff08;簡稱ES&#xff09; Elasticsearch是用Java開發并且是當前最流行的開源的企業級搜索引擎。能夠達到實時搜索&#xff0c;穩定&#xff0c;可靠&#xff0c;快速&#xff0c;安裝使用方便。 1.2 ElasticSearch與Lucene的關…

Angular項目升級的一般步驟?

升級Angular項目是一個重要的任務&#xff0c;可以帶來性能改進、新功能和安全性增強等好處。以下是升級Angular項目的一般步驟&#xff1a; 1、備份項目文件&#xff1a; 在進行升級之前&#xff0c;務必對整個項目進行備份&#xff0c;以防意外情況發生。 2、查看當前版本&…

如何快速遷移其他云服務器中的網站數據到騰訊云輕量應用服務器中?教你使用寶塔Linux面板遷移網站

要快速遷移其他云服務器中的網站數據到騰訊云輕量應用服務器中&#xff0c;可以遵循以下步驟&#xff1a; 準備遷移前的工作&#xff1a;首先&#xff0c;確保你已經有了從其他云服務器到騰訊云輕量應用服務器的數據備份。這一步是為了在遷移過程中避免數據丟失或損壞。 使用寶…

模擬器抓HTTP/S的包時如何繞過單向證書校驗(XP框架)

模擬器抓HTTP/S的包時如何繞過單向證書校驗&#xff08;XP框架&#xff09; 逍遙模擬器無法激活XP框架來繞過單向的證書校驗&#xff0c;如下圖&#xff1a; ?? 解決辦法&#xff1a; 安裝JustMePlush.apk安裝Just Trust Me.apk安裝RE管理器.apk安裝Xposedinstaller_逍遙64位…