學習打卡---回溯

回溯,所有回溯都可以轉換成樹形結構進行解決

我們將樹形結構分為縱向和橫向兩個方面
遞歸是縱向循環,也就是縱向方面,到了葉子節點就收網回溯
循環是橫向循環,也就是橫向方面,到了數組末尾就結束
回溯屬于是將二叉樹的子節點狀態回歸到了其父節點時的狀態,說白了,就好比循環,哪怕循環變量i被利用了無數次,只要i的值不發生變化,那么循環就始終不會更改它的目標

回溯模板
void backtracking(參數) {
? ? if (終止條件) {
? ? ? ? 存放結果;
? ? ? ? return;
? ? }

? ? for (選擇:本層集合中元素(樹中節點孩子的數量就是集合的大小)) {
? ? ? ? 處理節點;
? ? ? ? backtracking(路徑,選擇列表); // 遞歸
? ? ? ? 回溯,撤銷處理結果
? ? }
}

k其實就已經限制樹的深度,因為就取k個元素,樹再往下深了沒有意義
注意樹深的限制,該限制可以幫我們找到葉子節點從而得到結果
葉子節點就是要收集的結果集,其實這也不一定,沒準題目要你把所有節點都搜集一遍

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

for循環橫向遍歷,遞歸縱向遍歷,回溯不斷調整結果集
剪枝精髓是:for循環在尋找起點的時候要有一個范圍,如果這個起點到集合終止之間的元素已經不夠 題目要求的k個元素了,就沒有必要搜索了。
所以我們要去重的是同一樹層上的“使用過”,同一樹枝上的都是一個組合里的元素,不用去重
同一樹層是for循環,而同一樹枝是遞歸

強調一下,樹層去重的話,需要對數組排序,但樹枝可能不會重復

樹層是同一個父節點的不斷追加,如果數層出現重復需要進行修改,則需要回到從父結點看起

打個比方

1,1,2

1? ? ? ? ? ? ? ? ? ? 1 ????????????????2

11? ? ?12? ? ? ? ? 12? ? ? ? ? ? ??

112

第一個1:1指向11,12

第二個1:1指向12

如何判斷該樹層重復,就需要回到最根本的父節點,父節點的遞歸中,如果這個點和上一個點相同,并且上一個點并沒有被訪問過,那就說明這是一個重復樹枝(該點與上一個點相同,重復:且上一個點沒被訪問過,獨立樹枝)

樹枝就不大可能重復了

樹枝是同一個前綴的不斷追加

遞歸中調用的元素屬于本層元素,不會被遞歸傳遞到下一層,這些本層元素一直在該層,直到遞歸中的歸到來
從遞的角度來看,層數一層層向下,這些本層元素好像并沒有什么效果,一旦通過歸回到了該層,這些本層元素會發揮它們應有的作用,維護著本層的秩序和規則
class Solution {
public:
? ? vector<vector<int>>res;
? ? vector<int>path;
? ? void dfs(vector<int>&nums,int startindex)
? ? {
? ? ? ? if(path.size()>1) res.push_back(path);
? ? ? ? if(startindex>nums.size())
? ? ? ? {
? ? ? ? ? ? return;
? ? ? ? }

? ? ? ? unordered_set<int>uset;
? ? ? ? for(int i=startindex;i<nums.size();i++)
? ? ? ? {
? ? ? ? ? ? if( (!path.empty()&&nums[i]<path.back())||uset.find(nums[i])!=uset.end())
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //路徑數組非空,后一個數一定會大于數組末尾元素數字,或者
? ? ? ? ? ? ? ? continue;
? ? ? ? ? ? }
? ? ? ? ? ? uset.insert(nums[i]);//本層元素,到了下一層就沒用了

? ? ? ? ? ? path.push_back(nums[i]);
? ? ? ? ? ? dfs(nums,i+1);
? ? ? ? ? ? path.pop_back();
? ? ? ? }
? ? }
? ? vector<vector<int>> findSubsequences(vector<int>& nums) {
? ? ? ? dfs(nums,0);
? ? ? ? return res;
? ? }
};

本文部分代碼和資料來自代碼隨想錄,感謝代碼隨想錄,感謝程序員Carl

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

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

相關文章

阿里云獲取DASHSCOPE_API_KEY教程,以及配置DASHSCOPE_API_KEY環境變量

要獲取阿里云的 DASHSCOPE_API_KEY&#xff08;通義千問API密鑰&#xff09;&#xff0c;需要在阿里云平臺上完成開通服務和創建密鑰的流程。以下是具體步驟&#xff1a; 1. 開通通義千問API服務 登錄阿里云賬號 訪問 阿里云官網&#xff0c;使用賬號密碼或RAM用戶登錄。 進入…

《去哪兒網Redis高并發實戰:從問題定位到架構升級》

去哪兒網Redis高并發實戰&#xff1a;從問題定位到架構升級 在互聯網行業競爭日益激烈的當下&#xff0c;高并發場景下的系統性能優化一直是技術團隊面臨的重要挑戰。對于去哪兒網這類在線旅游平臺來說&#xff0c;節假日期間的流量高峰更是對系統架構的嚴峻考驗。本文將深入剖…

Zynq + FreeRTOS + YAFFS2 + SQLite3 集成指南

Zynq FreeRTOS YAFFS2 SQLite3 集成指南 一、系統架構設計 #mermaid-svg-qvuP6slyza89wsiT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qvuP6slyza89wsiT .error-icon{fill:#552222;}#mermaid-svg-qvuP6slyz…

設計模式精講 Day 6:適配器模式(Adapter Pattern)

【設計模式精講 Day 6】適配器模式&#xff08;Adapter Pattern&#xff09; 文章內容 在“設計模式精講”系列的第6天&#xff0c;我們將深入講解適配器模式&#xff08;Adapter Pattern&#xff09;。作為結構型設計模式之一&#xff0c;適配器模式的核心思想是將一個類的接…

系統穩定性治理

一、微服務內部異常 描述 微服務Pod自動重啟表現&#xff1a;服務波動&#xff08;響應時間不穩定&#xff09;、監控指標異常&#xff08;Pod重啟次數增加&#xff0c;CPU/內存波動&#xff09;、Kubernetes事件記錄容器重啟原因影響&#xff1a;服務中斷、性能波動、資源消耗…

多智能體協同的力量:賦能AI安全報告系統的智能設計之道

“設想一個由‘數據采集者’、‘風險分析師’、‘報告撰寫員’甚至‘合規監督員’組成的虛擬團隊&#xff0c;它們如何攜手打造一份深度洞察、精準預警的危化安全報告&#xff1f;這正是多智能體協作在AI安全領域的魅力所在。” 一、挑戰升級&#xff1a;單一AI難以應對的復雜性…

ceph pg 卡在 active+clean+remapped 狀態

場景 ceph 環境中有個 osd.0 做了 raid0 ,后來想剔除掉,執行了 ceph osd out 0 然后等了很長時間等 pg 數據遷移到別的 osd,但是最后有一個 pg 狀態卡在了 active+clean+remapped 狀態。如下: ceph pg ls-by-osd 0 PG OBJECTS DEGRADED MISPLACED UNFOUND BYTES …

systemd[1]: Failed to start LSB: Bring up/down networking

使用ssh連接虛擬機服務時&#xff0c;連接異常&#xff0c;虛擬機系統centos 7&#xff0c;于是登錄虛擬機&#xff0c;查看服務ip&#xff0c;發現配置的靜態ip未生效。因此重啟網卡systemctl restart network&#xff0c;出現報錯&#xff0c;使用systemctl status network查…

Go 語言使用 excelize 庫操作 Excel 的方法

在筆者開發的項目中&#xff0c;有操作excel的需要&#xff0c;由于go操作excel比較方便且功能強大&#xff0c;于是選擇使用go來操作excel。github.com/360EntSecGroup-Skylar/excelize庫是一個功能強大且易于使用的庫&#xff0c;它支持創建、讀取和修改 Excel 文件&#xff…

Java基礎(三):邏輯運算符詳解

Java基礎系列文章 Java基礎(一)&#xff1a;發展史、技術體系與JDK環境配置詳解 Java基礎(二)&#xff1a;八種基本數據類型詳解 Java基礎(三)&#xff1a;邏輯運算符詳解 目錄 一、什么是邏輯運算符&#xff1f;二、基礎邏輯運算符&#xff08;3種&#xff09;1、&&…

Bugku-CTF-web

最近刷了一下 Bugku-CTF-web 的61-70題&#xff08;平臺目前只有67&#xff09;&#xff0c;好難好難&#xff0c;全都是知識的盲區。各種代碼審計&#xff0c;各種反序列化&#xff0c;各種反彈shell&#xff0c;各種模版注入&#xff0c;各種字符串繞過&#xff0c;可以說是W…

GitLab 工具如何提升我的工作效率

在當今快節奏的軟件開發和技術創作領域&#xff0c;作為一名博主&#xff0c;高效的工作流程和強大的協作工具至關重要。GitLab 作為一款集成了版本控制、項目管理、持續集成與持續部署&#xff08;CI/CD&#xff09;等功能于一體的平臺&#xff0c;為我的工作帶來了巨大的便利…

Unity Addressable使用之服務器遠程加載

本地模擬服務器加載 1、創建一個Profiles&#xff0c;將Remote設為Editor Hosted 2、在Addressables Group窗口將Profile設為Local Test 3、將某個Asset Groups設為Remote加載 4、Build資源 5、打開本地模擬服務器 Addressables Hosting 窗口是 Addressable 提供的一個內置本…

Java基礎八股文 - 面試者心理歷程與標準答案

Java基礎八股文 - 面試者心理歷程與標準答案 前言&#xff1a;如何應對Java基礎面試問題 面試Java基礎時&#xff0c;很多候選人會因為緊張而忘記平時熟悉的知識點。本文將從面試者的心理歷程出發&#xff0c;教你如何在面試中用自己的思路組織答案&#xff0c;然后給出標準回…

學習筆記088——Windows配置Tomcat自啟

1、下載 下載Windows版本tomcat。本文下載的版本是&#xff1a; apache-tomcat-9.0.31-windows-x64.zip 點擊下載 注意&#xff1a;要確保bin目錄下有 service.bat 文件&#xff01; 2、配置服務 解壓后&#xff0c;終端進入bin?錄&#xff0c;安裝服務&#xff1a;service…

SSL證書怎么配置到服務器上 ?

在網絡安全備受關注的當下&#xff0c;SSL證書已成為網站安全的標配。但僅有SSL證書還不夠&#xff0c;正確將其配置到服務器上&#xff0c;才能真正發揮保障數據傳輸安全、驗證網站身份的作用。由于服務器類型多樣&#xff0c;不同服務器的SSL證書配置方法存在差異&#xff0c…

AI與SEO關鍵詞協同進化

內容概要 人工智能&#xff08;AI&#xff09;與搜索引擎優化&#xff08;SEO&#xff09;的結合&#xff0c;正深刻變革著關鍵詞策略的制定與執行方式。本文旨在探討AI技術如何驅動SEO關鍵詞領域的智能化進化&#xff0c;核心在于利用AI強大的數據處理與模式識別能力&#xf…

01.線性代數是如何將復雜的數據結構轉化為可計算的數學問題,這個過程是如何進行的

將復雜數據結構轉化為可計算的數學問題是數據科學、機器學習和算法設計中的核心環節。這一過程需要結合數據特性、數學理論和計算框架,通過系統化的抽象和建模實現。以下是具體轉化流程及關鍵技術解析: 一、數據結構分析:解構原始數據的本質特征 1. 識別數據類型與結構特性…

華為OD機考-網上商城優惠活動-模擬(JAVA 2025B卷)

import java.util.Scanner;public class Test3 {static int mjq;static int dzq;static int wmkq;static class Group {int price;// 打折后價格int num;// 優惠券使用熟練}public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input sc…

JavaScript 數據處理 - 將字符串按指定位數截斷并放入數組(基礎實現、使用正則表達式實現、使用正則表達式簡化實現)

將字符串按指定位數截斷并放入數組 1、基礎實現 /*** 將字符串按指定位數截斷并放入數組* param {string} str - 要處理的字符串* param {number} n - 每段截斷的位數* returns {Array} 截斷后的字符串數組*/ function splitStringByLength(str, n) {const result [];for (l…