遞歸+回溯

遞歸-回溯

本文參考自代碼隨想錄視頻:

https://www.bilibili.com/video/BV1cy4y167mM

https://www.bilibili.com/video/BV1ti4y1L7cv

遞歸+回溯理論基礎

  • 只要有遞歸,就會有回溯,遞歸函數的下面的部分通常就是回溯的邏輯。

  • 回溯是純暴力的搜索,有時可以通過剪枝做一些優化。

回溯搜索解決的常見問題

  • 組合問題
  • 切割問題
  • 子集問題
  • 排列問題
  • 棋盤問題

如何理解回溯搜索

所有的回溯法都可以抽象為一個樹形結構(n叉樹)

回溯法模版

  1. 回溯函數一般是無返回值的遞歸函數 backtracking,其參數通常較多,我們可以在寫邏輯的時候根據需要來添加參數
  2. 終止條件:在回溯遞歸函數中,到了終止條件時,通常就是我們收集結果的時候了
  3. 單層搜索的邏輯:通常是一個 for-loop,處理集合的每一個元素,在循環體中處理節點,再進行遞歸調用,然后再撤銷掉處理節點的操作(即所謂回溯)。

以下用偽代碼的形式將上述模板寫出來:

void backtracking(...) {if (終止條件) {收集結果;return;}for (集合中的元素) {處理節點;backtracking(...); // 遞歸調用撤銷處理節點的操作; 		// 回溯}
}

LeeCode相關習題

77. 組合

如果我們未曾接觸過回溯算法,遇到本題的暴力做法會是怎樣做呢,很容易想到,就是嵌套 k 層 for-loop,當 k 是 2 的時候,這也是可行的,但是當 k 是 50 的時候呢,我們發現,即使想要暴力做,程序也不好寫了。

這時就考慮到我們的遞歸-回溯算法,遞歸中的每一層其實就是一層 for 循環,這樣我們就可以自動地去嵌套。


class Solution {
private:void backtracking(vector<vector<int>>& res, vector<int>& curr, int pos, int n, int k) {if (curr.size() == k) {res.push_back(curr);return;}// for (int i=pos; i<n-(k-curr.size()+1; ++i)for (int i=pos; i<=n; ++i) {curr.push_back(i);backtracking(res, curr, i+1, n, k);curr.pop_back();}}
public:vector<vector<int>> combine(int n, int k) {vector<vector<int>> res;vector<int> curr;backtracking(res, curr, 1, n, k);return res;}
}

pos表示本次遞歸調用起始的位置,res存放最終的全部組合結果,curr存放當前正在搜索的組合結果。

剪枝:注意到當 i 小于 n-(k-curr.size()) + 1 時,當前就已經不可能得到長度為 k 的結果了,故可以調整 for 循環的范圍,實現剪枝。代碼中注釋掉的 for 循環實際上就是剪枝的版本。注意:遞歸回溯算法在很多時候都是通過合理地減小 for 循環的范圍來實現剪枝的。

另一種角度

另一種角度:每遍歷到一個元素,我們可以選擇將它加入結果或跳過它。

78. 子集

class Solution {
private:void backtracking(vector<vector<int>>& res, const vector<int>& nums, vector<int>& curr, int pos) {if (pos == nums.size()) {res.push_back(curr);return;}// 跳過當前元素backtracking(res, nums, curr, pos+1);// 添加當前元素curr.push_back(nums[pos]);backtracking(res, nums, curr, pos+1);curr.pop_back();}
public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> res;vector<int> curr;backtracking(res, nums, curr, 0);return res;}
};

Ref:

https://www.bilibili.com/video/BV1cy4y167mM

https://www.bilibili.com/video/BV1ti4y1L7cv

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

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

相關文章

Nvidia CUDA初級教程1 CPU體系架構綜述

Nvidia CUDA初級教程1 CPU體系架構綜述 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p2 講師&#xff1a;周斌 本節內容&#xff1a;了解現代CPU的架構和性能優化&#xff1a; 流水線 Pipelining分支預測 Branch Prediction超標量 Superscalar亂序執行 Out…

Nvidia CUDA初級教程2 并行程序設計概述

Nvidia CUDA初級教程2 并行程序設計概述 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p3 講師&#xff1a;周斌 本節內容&#xff1a; 為什么需要&#xff1f;怎么做&#xff1f;一些技術和概念 串并行計算模式 串行計算模式 常規軟件時串行的 設計運行…

Nvidia CUDA初級教程4 GPU體系架構概述

Nvidia CUDA初級教程4 GPU體系架構概述 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p5 講師&#xff1a;周斌 本節內容&#xff1a; 為什么需要GPU三種方法提升GPU的處理速度實際GPU的設計舉例&#xff1a; NVDIA GTX 480: FermiNVDIA GTX 680: Kepler GP…

Nvidia CUDA初級教程5 CUDA/GPU編程模型

Nvidia CUDA初級教程5 CUDA/GPU編程模型 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p6 講師&#xff1a;周斌 本節內容&#xff1a; CPU和GPU互動模式GPU線程組織模型&#xff08;需要不停強化&#xff09;GPU存儲模型基本的編程問題 CPU與GPU交互 各自…

Nvidia CUDA初級教程6 CUDA編程一

Nvidia CUDA初級教程6 CUDA編程一 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p7 講師&#xff1a;周斌 GPU架構概覽 GPU特別使用于&#xff1a; 密集計算&#xff0c;高度可并行計算圖形學 晶體管主要被用于&#xff1a; 執行計算而不是 緩存數據控制指令…

由前中后遍歷序列構建二叉樹

由前/中/后遍歷序列構建二叉樹 基礎 首先&#xff0c;我們需要知道前中后序三種深度優先遍歷二叉樹的方式的具體順序&#xff1a; 前序&#xff1a;中左右中序&#xff1a;左中右后序&#xff1a;左右中 另外&#xff0c;要知道只有中序前/后序可以唯一確定一棵二叉樹&…

手寫nms

手寫nms 計算寬高的時候加1是為什么&#xff1f; 本文總結自互聯網的多種nms實現&#xff0c;供參考&#xff0c;非博主原創&#xff0c;各原文鏈接如下&#xff0c;也建議大家動手寫一寫。 Ref&#xff1a; 淺談NMS的多種實現 目標窗口檢測算法-NMS非極大值抑制 一、fas…

目標檢測綜述

目標檢測綜述 轉自&#xff1a;https://zhuanlan.zhihu.com/p/383616728 論文參考&#xff1a;[Object Detection in 20 Years: A Survey][https://arxiv.org/abs/1905.05055] 引言 目標檢測領域發展至今已有二十余載&#xff0c;從早期的傳統方法到如今的深度學習方法&#x…

Nvidia CUDA初級教程7 CUDA編程二

Nvidia CUDA初級教程7 CUDA編程二 視頻&#xff1a;https://www.bilibili.com/video/BV1kx411m7Fk?p8 講師&#xff1a;周斌 本節內容&#xff1a; 內置類型和函數 Built-ins and functions線程同步 Synchronizing線程調度 Scheduling threads存儲模型 Memory model重訪 Matr…

詳解優酷視頻質量評價體系

萬字長文 | 詳解優酷視頻質量評價體系 分享嘉賓&#xff5c;李靜博士&#xff0c;阿里巴巴文娛集團資深算法專家&#xff0c;阿里巴巴大文娛摩酷實驗室視頻體驗與質量團隊負責人 整理出品&#xff5c;AICUG人工智能社區 本文地址&#xff1a;https://www.6aiq.com/article/1617…

視頻質量評價:挑戰與機遇

視頻質量評價&#xff1a;挑戰與機遇 轉自&#xff1a;https://zhuanlan.zhihu.com/p/384603663 本文整理自鵬城實驗室助理研究員王海強在LiveVideoStack線上分享上的演講。他通過自身的實踐經驗&#xff0c;詳細講解了視頻質量評價的挑戰與機遇。 文 / 王海強 整理 / LiveVi…

關于二分法的邊界問題及兩種寫法

關于二分法的邊界問題及兩種寫法 二分查找法大家很熟悉了&#xff0c;對于一個有序序列&#xff0c;我們可以通過二分查找法在 O(logN)O(logN)O(logN) 的時間內找到想要的元素。但是&#xff0c;在代碼實現的過程中&#xff0c;如果沒有仔細理解清楚&#xff0c;二分法的邊界條…

LeetCode上的各種股票最大收益

LeetCode上的各種股票最大收益 對于力扣平臺上的股票類型的題目&#xff1a; 121 買賣股票的最佳時機 122 買賣股票的最佳時機 II 123 買賣股票的最佳時機 III 124 買賣股票的最佳時機 IV 309 最佳買賣股票時機含冷凍期 714 買賣股票的最佳時機含手續費 劍指 Offer 63. …

建設專業化運維服務團隊必要性

信息系統的生命周期涵蓋&#xff1a;設計、開發、測試、部署上線、運行維護。其中&#xff0c;運行維護階段是信息系統生命周期中的關鍵環節&#xff0c;其執行效果直接影響系統是否能達到預期的運行目標。為了實現這個目標&#xff0c;我們必須建立一個以業務服務為導向的專業…

docker初探

docker初探 本文旨在介紹 docker 基本的安裝、常用命令和常見概念的辨析&#xff0c;方便新手入門和筆者日后查閱&#xff0c;大部分內容整理自互聯網&#xff0c;原出處在文中注明。 文章目錄docker初探docker安裝&#xff08;mac&#xff09;版本、信息相關命令version/info…

ubuntu安裝zsh、oh-my-zsh及常用配置

ubuntu安裝zsh、oh-my-zsh及常用配置 目前&#xff0c;ubuntu默認的shell是bash&#xff0c;但還有一種shell&#xff0c;叫做zsh它比bash更加強大&#xff0c;功能也更加完善&#xff0c;zsh雖說功能強大&#xff0c;但是配置比較復雜導致流行度不是很高 但是好東西終究是好…

Segmentaion標簽的三種表示:poly、mask、rle

Segmentaion標簽的三種表示&#xff1a;poly、mask、rle 不同于圖像分類這樣比較簡單直接的計算機視覺任務&#xff0c;圖像分割任務&#xff08;又分為語義分割、實例分割、全景分割&#xff09;的標簽形式稍為復雜。在分割任務中&#xff0c;我們需要在像素級上表達的是一張…

tensorboard報錯:ValueError Duplicate plugins for name projector 問題的出現及解決過程

tensorboard報錯&#xff1a;ValueError: Duplicate plugins for name projector 問題的出現及解決過程 記錄如題問題的出現及解決過程。 報錯命令及信息 筆者在終端調用 tensorboard 時&#xff1a; tensorboard --logdirruns/ --bind_all報錯&#xff1a; raise ValueEr…

發布自己的Python包(Pypi)

發布自己的Python包(Pypi) 我們經常使用 Pypi 來安裝包&#xff0c;但是有時候我們也想要發布自己的 Pypi 包&#xff0c;有可能我們寫了一個特別牛的包&#xff0c;也有可能我們只是想使用自己常用的一些輪子&#xff0c;可能這是我們日常編碼中很常用的一些輪子&#xff0c;…

Ubuntu PPA 使用指南

Ubuntu PPA 使用指南 轉自&#xff1a;https://zhuanlan.zhihu.com/p/55250294 一篇涵蓋了在 Ubuntu 和其他 Linux 發行版中使用 PPA 的幾乎所有問題的深入的文章。 如果你一直在使用 Ubuntu 或基于 Ubuntu 的其他 Linux 發行版&#xff0c;例如 Linux Mint、Linux Lite、Zorin…