leetcode77組合——經典回溯算法

本文主要講解組合的要點與細節,以及回溯算法的解題步驟,按照步驟思考更方便理解?

c++和java代碼如下,末尾

給定兩個整數?n?和?k,返回范圍?[1, n]?中所有可能的?k?個數的組合。

你可以按?任何順序?返回答案。

?具體要點:

1. 首先,這道題的暴力解法是k層for循環,遍歷所有的情況。但是這樣子時間復雜度會很高。所以對于這類排列組合的問題,通常我們使用回溯算法來進行遍歷,可以花一分鐘參考回溯的前言概述。


2. 然后讓我們來回顧一下回溯,回溯本質是一個樹結構通常是由兩個結構組成:for+遞歸。

? ? ? ? 其中,for用來表示樹的寬度,遍歷每層的集合元素集,可以理解一個節點有多少個孩子,這個for循環就執行多少次。

? ? ? ? 遞歸用來表示樹的深度


3. 對于本題要求,我們需要先創建兩個數組,一個用來存放最終的結果,一個用來存放過程中每次的結果

vector<vector<int>> res; //用來存放最終的結果
vector<int> temp; //用來存放過程中每次的結果

?4. 接著我們就可以考慮回溯算法的實現,具體包括兩部分:for循環+遞歸

首先,我們來考慮遞歸,說到遞歸,就要思考遞歸三要素

  • 遞歸函數參數與返回值
  • 終止條件
  • 單層遞歸邏輯

返回值:由于我們是直接操作數組,不像二叉樹一樣需要返回節點,所以遞歸的返回值是void

參數:回溯算法中的遞歸參數較多,我們在寫代碼過程中慢慢添加

終止條件:也就是我們收集結果的條件,當我們的temp存放的數量等于k時,就需要收集結果了

單層遞歸邏輯:添加當前元素a到temp中——a向下遞歸——移除剛才添加的元素a

其次,讓我們考慮一下for循環的細節

? ? ? ? for循環的起始值應該是什么呢?

? ? ? ? 這個細節是回溯中重要的點,因為本題是“組合”,所以不需要順序,即{1,2}和{2,1}是一個意思,只保留一個,所以下一層遞歸時,起始值就+1,從而達到去重的目的。

    void backtracing(int n, int k,vector<vector<int>>& res, vector<int> temp,int start) {//終止條件if (temp.size() == k) {//收集結果res.push_back(temp);return;}for (int i = start; i <= n; ++i) {temp.push_back(i);//添加當前元素backtracing(n, k, res, temp, i + 1);//相下遞歸,起始值+1temp.pop_back();//刪除剛才添加的元素,實現回溯}return;}

以上就是回溯的整體邏輯,讓我們總結一下重要的細節:

  • 遞歸的返回值
  • 遞歸的終止條件
  • for循環的起始值

在回溯過程中大家重點思考一下這幾個細節點,有助于我們更好的實現代碼

如果覺得我的講解有一點幫助,十分感謝您的喜歡。

c++代碼:

#include<bits/stdc++.h>
using namespace std;class Solution {
public:vector<vector<int>> combine(int n, int k) {//組合,不考慮順序vector<vector<int>> res;vector<int> temp;backtracing(n, k, res, temp, 1);return res;}void backtracing(int n, int k,vector<vector<int>>& res, vector<int> temp,int start) {//終止條件if (temp.size() == k) {//收集結果res.push_back(temp);return;}for (int i = start; i <= n; ++i) {temp.push_back(i);//添加當前元素backtracing(n, k, res, temp, i + 1);//相下遞歸temp.pop_back();//刪除剛才添加的元素,實現回溯}return;}};

java代碼


class Solution {public List<List<Integer>> combine(int n, int k) {List<List<Integer>> res = new ArrayList<List<Integer>>();List<Integer> temp = new ArrayList<>();backtracking(n, k, res, temp, 1);return res;}public void backtracking(int n, int k, List<List<Integer>> res, List<Integer> temp, int start) {//終止條件if (temp.size() == k) {res.add(new ArrayList<>(temp));return;}for (int i = start; i <= n; i++) {temp.add(i);backtracking(n, k, res, temp, i + 1);temp.remove(temp.size() - 1);}return;}
}

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

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

相關文章

將大型語言模型模塊化打造協作智能體

B UILDING C OOPERATIVE E MBODIED A GENTS MODULARLY WITH L ARGE L ANGUAGE M ODELS 論文鏈接&#xff1a; https://arxiv.org/abs/2307.02485https://arxiv.org/abs/2307.02485 1.概述 在去中心化控制及多任務環境中&#xff0c;多智能體合作問題因原始感官觀察、高昂…

【機器學習】機器學習重塑廣告營銷:精準觸達,高效轉化的未來之路

&#x1f4dd;個人主頁&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; ?目錄 &#x1f4d2;1. 引言&#x1f4d9;2. 機器學習基礎與廣告營銷的結合&#x1f9e9;機器學習在廣告營銷中的核心應用領域&#x1f339;用…

【React】React18 Hooks 之 useReducer

目錄 useReducer案例1&#xff1a;useReducer不帶初始化函數案例2&#xff1a;useReducer帶初始化函數注意事項1&#xff1a;dispatch函數不會改變正在運行的代碼的狀態注意事項2&#xff1a;獲取dispatch函數觸發后 JavaScript 變量的值注意事項3&#xff1a;觸發了reducer&am…

webrtc sfu性能壓測

1. 前言 不少網友最近私信我&#xff0c;咨詢webrtc sfu服務端性能問題&#xff0c;SRS開源服務能支持多少路webrtc流&#xff0c;mediasoup單房間能支持多少個人&#xff0c;推流能接入多少路&#xff0c;拉流能拉取多少路&#xff1f;720p能支持多少路&#xff0c;360p能支持…

Spring Boot集成olingo快速入門demo

1.什么是olingo&#xff1f; Apache Olingo 是個 Java 庫&#xff0c;用來實現 Open Data Protocol (OData)。 Apache Olingo 包括服務客戶端和 OData 服務器方面。 Open Data Protocol &#xff08;開放數據協議&#xff0c;OData&#xff09; 是用來查詢和更新數據的一種W…

【吊打面試官系列-MyBatis面試題】MyBatis 實現一對多有幾種方式,怎么操作的?

大家好&#xff0c;我是鋒哥。今天分享關于 【MyBatis 實現一對多有幾種方式,怎么操作的&#xff1f;】面試題&#xff0c;希望對大家有幫助&#xff1b; MyBatis 實現一對多有幾種方式,怎么操作的&#xff1f; 有聯合查詢和嵌套查詢。聯合查詢是幾個表聯合查詢,只查詢一次,通過…

觀察矩陣(View Matrix)、投影矩陣(Projection Matrix)、視口矩陣(Window Matrix)及VPM矩陣及它們之間的關系

V表示攝像機的觀察矩陣&#xff08;View Matrix&#xff09;&#xff0c;它的作用是把對象從世界坐標系變換到攝像機坐標系。因此&#xff0c;對于世界坐標系下的坐標值worldCoord(x0, y0, z0)&#xff0c;如果希望使用觀察矩陣VM將其變換為攝像機坐標系下的坐標值localCoord(x…

【滲透入門】HTTP請求包

文章目錄 前言HTTP GET請求包HTTP POST請求包Content-Type 前言 HTTP&#xff08;HyperText Transfer Protocol&#xff09;請求包&#xff0c;是Web通信的基礎。HTTP請求包格式主要由以下幾部分組成&#xff1a; 請求行&#xff1a;包含了請求方法&#xff08;GET、POST、PUT…

32單片機,C語言與匯編聯合編譯的幾種方式

適用編譯器&#xff1a;Keil5 方式一&#xff1a; 單獨創建一個.s匯編文件&#xff0c;在匯編文件內對函數進行EXPORT聲明 r0寄存器是函數傳入的第一個參數&#xff0c;r1寄存器是函數傳入的第二個參數&#xff0c;以次類推。參數最多不確定是到r4為止&#xff0c;還是到r12…

Node.js-path 模塊

path 模塊 path 模塊提供了 操作路徑 的功能&#xff0c;如下是幾個較為常用的幾個 API&#xff1a; 代碼實例&#xff1a; const path require(path);//獲取路徑分隔符 console.log(path.sep);//拼接絕對路徑 console.log(path.resolve(__dirname, test));//解析路徑 let pa…

Robust Regression

最小二乘回歸受數據中的離群點的影響較大&#xff0c;穩健回歸通過降低離群點的影響緩解此問題。M估計法是穩健回歸的重要方法之一&#xff0c;M 估計法的目標函數為&#xff1a; m i n ∑ ρ ( ? i ) m i n ∑ ρ ( y i ? β ^ ? X i ) min\sum\rho(\epsilon_i) min\sum\…

vulhub-activemq(CVE-2016-3088)

在 Apache ActiveMQ 5.12.x~5.13.x 版本中&#xff0c;默認關閉了 fileserver 這個應用&#xff08;不過&#xff0c;可以在conf/jetty.xml 中開啟&#xff09;&#xff1b;在 5.14.0 版本后&#xff0c;徹底刪除了 fileserver 應用。【所以在滲透測試過程中要確定好 ActiveMQ …

word 使用手冊

word 文檔中如何將下行的指定文字退格到上行中 就像是這樣的 編號&#xff1a;111 密碼&#xff1a;222 編號&#xff1a;123 密碼&#xff1a;321 編號&#xff1a;124 密碼&#xff1a;331 變成 編號&#xff1a;111密碼&#xff1a;222 編號&#xff1a;123密碼&#xff1…

數據結構1:C++實現變長數組

數組作為線性表的一種&#xff0c;具有內存連續這一特點&#xff0c;可以通過下標訪問元素&#xff0c;并且下標訪問的時間復雜的是O(1)&#xff0c;在數組的末尾插入和刪除元素的時間復雜度同樣是O(1)&#xff0c;我們使用C實現一個簡單的邊長數組。 數據結構定義 class Arr…

華為OD機試 - 來自異國的客人(Java 2024 D卷 100分)

華為OD機試 2024D卷題庫瘋狂收錄中&#xff0c;刷題點這里 專欄導讀 本專欄收錄于《華為OD機試&#xff08;JAVA&#xff09;真題&#xff08;D卷C卷A卷B卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一題都有詳細的答題思路、詳細的代碼注釋、樣例測…

新手教學系列——前后端分離API優化版

在之前的文章《Vue 前后端分離開發:懶人必備的API SDK》中,我介紹了通過Object對象自動生成API的方法。然而,之前的代碼存在一些冗余之處。今天,我將分享一個改進版本,幫助你更高效地管理API。 改進版API SDK 首先,讓我們來看一下改進后的代碼: import request from …

深入理解 KVO

在 iOS 中&#xff0c;KVO&#xff08;Key-Value Observing&#xff09;是一個強大的觀察機制&#xff0c;它的底層實現相對復雜。KVO 利用 Objective-C 的動態特性&#xff0c;為對象的屬性提供觀察能力。 KVO 的底層實現 1. 動態子類化 當一個對象的屬性被添加觀察者時&am…

6、Redis系統-數據結構-01-String

Redis 數據結構簡介 前言 Redis 是一個高性能的內存數據庫&#xff0c;其關鍵在于其數據結構的設計。Redis 數據結構是指底層實現 Redis 鍵值對中值的數據類型的方式。它包括了以下幾種主要對象&#xff1a; String&#xff08;字符串&#xff09;對象&#xff1a;最基本的數…

[C++][CMake][流程控制]詳細講解

目錄 1.條件判斷1.基本表達式2.邏輯判斷3.比較4.文件操作5.其他 2.循環1.foreach2.while 1.條件判斷 在進行條件判斷的時候&#xff0c;如果有多個條件&#xff0c;那么可以寫多個elseif&#xff0c;最后一個條件可以使用else&#xff0c;但是開始和結束是必須要成對出現的&am…

WordPress常見問題及簡要說明

1. 如何安裝WordPress? 簡要說明&#xff1a;WordPress是一個流行的內容管理系統&#xff0c;可以幫助用戶快速搭建網站。安裝WordPress需要以下幾個步驟&#xff1a;下載WordPress安裝包、上傳到服務器、創建數據庫、配置數據庫信息、完成安裝。 2. 如何創建一個新的WordPr…