回溯題解——全排列【LeetCode】

46. 全排列

一、算法邏輯(逐步通順講解每一步思路)

該算法使用了典型的 回溯(backtracking)+ 狀態數組 思路,逐層遞歸生成排列。

題目目標:給定一個無重復整數數組 nums,返回其所有可能的全排列

具體思路如下:


? 1?? 初始化變量:

  • n = len(nums):數組長度,表示排列長度;

  • ans = []:最終結果列表,保存所有排列;

  • path = [0] * n:當前正在構造的排列路徑(長度固定為 n);

  • on_path = [False] * n:記錄哪些下標的元素已經被使用,用來避免重復選擇。


? 2?? 定義遞歸函數 dfs(i):表示當前正在構建第 i 位上的數字。

  • 遞歸終止條件:當 i == n,說明整個排列已經構造完成,path 中已有一個完整解;

    • 使用 path.copy() 將當前路徑添加到 ans 中(防止引用修改)。


? 3?? 遍歷所有可選數字:

  • 遍歷 nums 中每個元素(通過索引 j);

  • 只有當 on_path[j] == False,才說明當前數字 nums[j] 還沒被選過;

  • nums[j] 放入第 i 位的 path[i] 中,并標記為已使用;

  • 然后遞歸下一層 dfs(i+1)

  • 回溯回來后,將 on_path[j] 設為 False,撤銷選擇,進入下一個分支。


? 4?? 啟動遞歸:

dfs(0) 開始,構造第 0 位,依次遞歸直到第 n-1 位,生成所有可能排列。


二、核心點總結

該算法的核心是:

使用回溯(DFS)方式按位構建排列,每一層遞歸嘗試將所有未使用的數字填入當前位置,通過布爾數組標記狀態,避免重復選擇,實現全排列。

? 回溯模板典型寫法(構造 + 撤銷);
? 使用顯式路徑數組 path[i] 來記錄當前位置數字;
? 使用布爾標記數組 on_path 控制元素是否被使用;
? 整體結構是“選擇—遞歸—撤銷選擇”的排列構造范式。

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:n = len(nums)ans = []path = [0] * non_path = [False] * ndef dfs(i:int) -> None:if i == n:ans.append(path.copy())return for j, on in enumerate(on_path):if not on:path[i] = nums[j]on_path[j]=Truedfs(i+1)on_path[j] = Falsedfs(0)return ans

三、時間復雜度分析

  • 一共有 n! 個不同的排列;

  • 每個排列的構造過程為 O(n),因為每一層選擇都要掃描一遍 on_path

所以總時間復雜度為:

O(n × n!)


四、空間復雜度分析

  • 顯式開銷:

    • path 數組:O(n)

    • on_path 數組:O(n)

  • 隱式開銷(遞歸棧):

    • 最多遞歸 n 層(深度為 n)

所以總空間復雜度為:

O(n)(不包含輸出)

如果包含所有輸出結果,則為:

O(n × n!)(因為結果中包含 n! 個長度為 n 的排列)


? 總結一句話

該算法采用典型回溯框架,按位構造路徑、記錄狀態、遞歸搜索,最終在 O(n × n!) 時間與 O(n) 空間下枚舉出所有排列,是解決排列問題最通用、穩定的模板方案。

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

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

相關文章

RICE模型或KANO模型在具體UI評審時的運用經驗

模型是抽象的產物,結合場景才好說明(數據為非精確實際數據,僅供參考,勿照搬)。 ??案例一:RICE模型解決「支付流程優化」vs「首頁動效升級」優先級爭議?? ??背景??:APP電商模塊在迭代中面臨兩個需求沖突——支付團隊主張優化支付失敗提示(減少用戶流失),設計…

緩存中間件

緩存與分布式鎖 即時性、數據一致要求不高的 訪問量大且更新頻率不高的數據 (讀多,寫少) 常用緩存中間件 redis Spring 如果用spring的情況下,由于redis沒有受spring的管理, 則我們需要自己先寫一個redis的配置類&…

大語言模型全方位解析:從基礎認知到RESTful API應用

文章目錄 前言一、初見大模型1.1 大語言模型基本知識了解(一)日常可能用到的大語言模型(二)大模型的作用(三)核心價值 1.2 大模型與人工智能關系1.3 大語言模型的“前世今生”與發展1.3.1 大語言模型的發展…

網安系列【11】之目錄穿越與文件包含漏洞詳解

文章目錄 前言一 目錄穿越漏洞1.1 什么是目錄穿越?1.2 目錄穿越的原理1.3 目錄穿越的常見形式1.3.1 基本形式1.3.2 編碼繞過1.3.3 絕對路徑攻擊 1.4 實戰案例解析1.4.1 案例1:簡單的目錄穿越1.4.2 案例2:編碼繞過 1.5 目錄穿越的危害 二、文件…

uri-url-HttpServletRequest

1. 使用HttpServletRequest UrlPathHelper 解析 出 url路徑 org.springframework.web.util.UrlPathHelper 是 Spring 框架中用于處理 HTTP 請求路徑的一個工具類,它幫助解析和處理與請求路徑相關的細節。特別是 getLookupPathForRequest(HttpServletRequest request…

Ubuntu22.04安裝p4顯卡 nvidia-utils-570-server 570.133.20驅動CUDA Version: 12.8

Ubuntu22.04安裝p4顯卡 nvidia-utils-570-server 570.133.20驅動CUDA Version: 12.8專業顯卡就是專業顯卡,盡管p4已經掉到了白菜價,官方的支持卻一直都保持,比如它可以裝上cuda12.8,這真的出乎我意料。NVIDIA Tesla P4顯卡的主要情況Pascal架…

工業日志AI大模型智能分析系統-前端實現

目錄 主要架構 前端項目結構 1. 核心實現代碼 1.1 API服務封裝 (src/api/log.ts) 1.2 TS類型定義 (src/types/api.ts) 1.3 Pinia狀態管理 (src/stores/logStore.ts) 1.4 日志分析頁面 (src/views/LogAnalysis.vue) 1.5 日志詳情組件 (src/components/LogDetail.vue) 2…

C++內存泄漏排查

引言 C內存泄漏問題的普遍性與危害內存泄漏排查大賽的背景與目標文章結構和主要內容概述 內存泄漏的基本概念 內存泄漏的定義與類型(顯式、隱式、循環引用等)C中常見的內存泄漏場景(指針管理不當、資源未釋放等)內存泄漏對程序性能…

20250706-4-Docker 快速入門(上)-常用容器管理命令_筆記

一、常用管理命令1. 選項1)ls功能:列出容器常用參數:-a:查看所有容器包含退出的-q:列出所有容器ID-l:列出最新創建的容器狀態使用技巧:容器很多時使用dock…

基于 Camunda BPM 的工作流引擎示例項目

項目介紹 這是一個基于 Camunda BPM 的工作流引擎示例項目,包含完整的后臺接口和前端頁面,實現了流程的設計、部署、執行等核心功能。 技術棧 后端 Spring Boot 2.7.9Camunda BPM 7.18.0MySQL 8.0JDK 1.8 前端 Vue 3Element PlusBpmn.jsVite 功能…

Day06_刷題niuke20250707

試卷01: 單選題 C 1. 在C中,一個程序無論由多少個源程序文件組成,其中有且僅有一個主函數main().說法是否正確? A 正確 B 錯誤 正確答案:A 官方解析: 在C程序設計中,一個完整的程序確實有且僅有一個main函數作為程序的入口點,這…

洛谷 P5788 【模板】單調棧

題目背景模板題&#xff0c;無背景。2019.12.12 更新數據&#xff0c;放寬時限&#xff0c;現在不再卡常了。題目描述給出項數為 n 的整數數列 a1…n?。定義函數 f(i) 代表數列中第 i 個元素之后第一個大于 ai? 的元素的下標&#xff0c;即 f(i)mini<j≤n,aj?>ai??{…

linux系統運行時_安全的_備份_還原_方法rsync

1.問題與需求 問題: 新部署的機器設備(主控RK3588), 沒有經過燒錄定制鏡像, 研發部署, 直接組裝發送到客戶現場需要通過frpc遠程部署: 安裝ros2 python包 docker鏡像 環境配置 自啟動配置 SN設備信息寫自動部署腳本, 實現一鍵部署升級無奈物聯網卡做了白名單限制, apt 和…

18套精美族譜Excel模板,助力家族文化傳承!

【資源分享】18套精美族譜Excel模板&#xff0c;助力家族文化傳承&#xff01; &#x1f3af; 本文分享一套完整的家族譜系資源&#xff0c;包含18個精心設計的Excel模板&#xff0c;從基礎模板到專業圖表&#xff0c;滿足各類家族的族譜制作需求。 一、為什么要制作族譜&…

MySQL Galera Cluster企業級部署

一、MySQL Galera Cluster簡介 主要特點 同步復制&#xff1a; 所有的寫操作&#xff08;包括插入、更新、刪除&#xff09;在集群中的所有節點上都是同步的。這意味著每個節點上的數據是完全一致的。 多主節點&#xff1a; 集群中的每個節點都是主節點。所有節點都可以處理讀…

HTTP 重定向

什么是 HTTP 重定向&#xff1f; HTTP 重定向&#xff08;HTTP Redirect&#xff09; 是服務器向客戶端&#xff08;通常是瀏覽器&#xff09;發出的指令&#xff0c;告訴客戶端某個請求的資源已被移到新的位置。重定向通常通過發送一個特殊的 HTTP 狀態碼&#xff08;例如 3x…

本地加載非在線jar包設置

項目中存在私有jar包&#xff0c;提示在線獲取不到&#xff0c;需要先獲取到完整的jar包在打進maven中再在項目中進行maven依賴引入 mvn install:install-file -DfileD:\tools\maven\apache-maven-3.5.2\local_repository2\org\ahjk\SixCloudCommon\1.0\SixCloudCommon-1.0-SN…

Codeforces Round 979 (Div. 2)

A c[1]-b[1]0&#xff0c;之后每個c[1]-b[1]最大都是maxa-mina&#xff0c;最大和最小放前兩個 B ans2^(a1)-2^s-1&#xff0c;1一個最小 C 我們可以把式子化為(....)||(....)||(....)括號里沒有||&#xff0c;如果括號全是1那么A贏&#xff0c;A盡量選擇把1選在一起 D …

UI前端大數據處理性能瓶頸突破:分布式計算框架的應用

hello寶子們...我們是艾斯視覺擅長ui設計、前端開發、數字孿生、大數據、三維建模、三維動畫10年經驗!希望我的分享能幫助到您!如需幫助可以評論關注私信我們一起探討!致敬感謝感恩!一、引言&#xff1a;前端大數據處理的性能困境與破局之路在數據爆炸增長的時代&#xff0c;UI…

病蟲害數據集

數據是泰迪杯主辦方提供的已經標記好的數據&#xff0c;4k畫質的圖片&#xff0c;總大小8個G 鏈接&#xff1a;https://pan.baidu.com/s/1fvmNHGrLvflEovjfCjDLOw?pwd6666 提取碼&#xff1a;6666 蟲害包括&#xff1a; 八點灰燈蛾 褐飛虱屬 白背飛虱 二化螟 蟋蟀 黃足…