python-leetcode 54.全排列

題目:

給定不含重復數字的數組nums,返回其所有可能的全排列,可以按任意順序返回答案

?回溯法

一種通過探索所有可能的候選解來找出所有的解的算法。如果候選解被確認不是一個解(或者至少不是最后一個解),回溯算法會通過在上一步進行一些變化拋棄該解,即回溯并且再次嘗試。

方法一:回溯

有?n?個排列成一行的空格,從左往右依此填入題目給定的?n?個數,每個數只能使用一次。以想到一種窮舉的算法,即從左往右每一個位置都依此嘗試填入一個數,看能不能填完這?n?個空格,在程序中用「回溯法」來模擬這個過程。

定義遞歸函數?backtrack(first,output),表示從左往右填到第?first?個位置,當前排列為?output。 那么整個遞歸函數分為兩個情況:

如果?first=n,說明已經填完了?n?個位置(注意下標從?0?開始),找到了一個可行的解將?output?放入答案數組中,遞歸結束

如果 first<n,要考慮這第 first 個位置要填哪個數。根據題目要求不能填已經填過的數,因此很容易想到的一個處理手段是定義一個標記數組 vis 來標記已經填過的數,那么在填第?first?個數的時候遍歷題目給定的?n?個數,如果這個數沒有被標記過,就嘗試填入,并將其標記,繼續嘗試填下一個位置,即調用函數?backtrack(first+1,output)。回溯的時候要撤銷這一個位置填的數以及標記,并繼續嘗試其他沒被標記過的數。

使用標記數組來處理填過的數是一個很直觀的思路,但是可不可以去掉這個標記數組呢?畢竟標記數組也增加了算法的空間復雜度。

答案是可以的,可以將題目給定的 n 個數的數組 nums 劃分成左右兩個部分,左邊的表示已經填過的數,右邊表示待填的數,在回溯的時候動態維護這個數組即可。

具體來說,假設已經填到第?first?個位置,那么?nums?數組中?[0,first?1]?是已填過的數的集合,[first,n?1]?是待填的數的集合,嘗試用?[first,n?1]?里的數去填第?first?個數,假設待填的數的下標為?i,么填完以后將第?i?個數和第?first?個數交換,即能使得在填第 first+1 個數的時候 nums 數組的 [0,first] 部分為已填過的數,[first+1,n?1] 為待填的數,回溯的時候交換回來即能完成撤銷操作。

舉個簡單的例子,假設有 [2,5,8,9,10] 這 5 個數要填入,已經填到第 3 個位置,已經填了 [8,9] 兩個數,那么這個數組目前為 [8,9?∣?2,5,10] 這樣的狀態,分隔符區分了左右兩個部分。假設這個位置要填 10 這個數,為了維護數組,我們將 2 和 10 交換,即能使得數組繼續保持分隔符左邊的數已經填過,右邊的待填 [8,9,10?∣?2,5] 。

輸入:nums = [1, 2, 3]
目標:生成所有可能的排列。

class Solution(object):def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""def backtrack(first=0):  #定義回溯函數用于遞歸生成所有排列,first 代表當前正在填充的索引位置,默認從 0 開始,該函數的目標是通過交換 nums 中的元素,生成所有可能的排列if first==n:  #說明 nums 的排列已經完成res.append(nums[:])#nums 的拷貝(不能直接 append(nums),否則后續的修改會影響結果)for i in range(first,n):#遍歷索引 first 到 n-1 之間的所有元素nums[first],nums[i]=nums[i],nums[first]#將 nums[i] 交換到 first 位置,使其成為當前排列的第 first 個數backtrack(first+1)#填充下一個位置的數nums[first],nums[i]=nums[i],nums[first]#nums是原地修改的,在回溯后需要撤銷之前的交換,恢復數組原狀,避免影響其他排列的生成n=len(nums)res=[]backtrack()return res

時間復雜度:O(n×n!),其中?n?為序列的長度

空間復雜度:O(n),其?n?為序列的長度。除答案數組以外,遞歸函數在遞歸過程中需要為每一層遞歸函數分配棧空間,

源自力扣官方題解
?

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

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

相關文章

python局部變量和全局變量

文章目錄 1.局部變量和全局變量2.局部變量2.1 局部變量的作用2.2 局部變量的生命周期 3. 全局變量3.1 函數不能直接修改全局變量的引用3.2 在函數內部修改全局變量的值3.3 全局變量定義的位置3.4 全局變量命名的建議 1.局部變量和全局變量 &#xff08;1&#xff09;局部變量 …

華為中小型企業項目案例

實驗目的(1) 熟悉華為交換機和路由器的應用場景 (2) 掌握華為交換機和路由器的配置方法 實驗拓撲實驗拓撲如圖所示。 華為中小型企業項目案例拓撲圖 實驗配置市場部和技術部的配置創建VLANLSW1的配置 [LSW1]vlan batch 10 20 [LSW1]q…

深度學習-簡介

一、幾個概念 &#xff08;1&#xff09;what is ai including? 看一張圖&#xff1a; 這里注意機器學習和深度學習的關系 &#xff08;2&#xff09;機器學習和模式識別有什么區別&#xff1f; 和機器學習同領域的有一個詞叫做模式識別&#xff0c;二者有什么區別呢? 機…

Unity小框架之單例模式基類

單例模式&#xff08;Singleton Pattern&#xff09;是一種常用的創建型設計模式&#xff0c;其核心目標是確保一個類只有一個實例&#xff0c;并提供一個全局訪問點。它常用于需要控制資源訪問、共享配置或管理全局狀態的場景&#xff08;如數據庫連接池、日志管理器、應用配置…

安裝 Powerlevel10k 及 Oh My Zsh 的使用

1. 簡介 Powerlevel10k 是 Oh My Zsh 最流行的終端主題&#xff0c;它不僅美觀&#xff0c;還提供 Git 狀態顯示、命令執行時間、網絡狀態、Python 虛擬環境指示等 實用功能。相比其他主題&#xff0c;Powerlevel10k 速度更快、可定制性更強。 本教程將詳細介紹如何安裝 Powe…

verilog有符號數處理摘要

在FPGA設計中&#xff0c;一般的算數運算符都是按照無符號數進行的。那么需要有符號數計算的時候&#xff0c;該怎么辦呢&#xff1f; 很久很久以前也就是Verilog-2001還沒有出現時&#xff0c;是手動操作的&#xff0c;也就是說&#xff0c;對于一個8位的無符號數&#xff0c…

在IDEA中連接達夢數據庫:詳細配置指南

達夢數據庫&#xff08;DM Database&#xff09;作為國產關系型數據庫的代表&#xff0c;廣泛應用于企業級系統開發。本文將詳細介紹如何在IntelliJ IDEA中配置并連接達夢數據庫&#xff0c;助力開發者高效完成數據庫開發工作。 準備工作 1. 下載達夢JDBC驅動 訪問達夢官方資…

app.config.globalProperties

目錄 一:基礎使用 1、簡介 2、使用 3、打印結果: 二:封裝 1、創建一個.ts文件(utils/msg.ts) 2、在main.ts中全局注冊 3、在頁面中使用 4、打印結果 一:基礎使用 1、簡介 app.config.globalProperties 是 Vue 3 應用實例&#xff08;app&#xff09;的一個配置屬性&…

openai 標準化協議 Structured Outputs 具體示例教程

Structured Outputs 具體示例教程 場景&#xff1a;個人財務管理助手 假設我們要構建一個 AI 助手&#xff0c;幫助用戶記錄和管理個人財務支出。用戶可以輸入自然語言描述&#xff08;如“昨天我花了50元買了午餐”&#xff09;&#xff0c;助手將提取關鍵信息并以結構化 JS…

16.使用讀寫包操作Excel文件:XlsxWriter 包

一 XlsxWriter 的介紹 XlsxWriter 只能寫入 Excel 文件。 OpenPyXL 和 XlsxWriter 的區別在筆記 15 。 二 如何使用 XlsxWriter 1.導包 import datetime as dtimport xlsxwriterimport excel 2.實例化工作簿 book xlsxwriter.Workbook("xlxswriter.xlsx") book.clo…

ChatGPT and Claude國內使用站點

RawChat kelaode chatgptplus chatopens&#xff08;4.o mini免費&#xff0c;plus收費&#xff09; 網頁&#xff1a; 定價&#xff1a; wildcard 網頁&#xff1a; 虛擬卡定價&#xff1a; 2233.ai 網頁&#xff1a; 定價&#xff1a; MaynorAPI chatgpt cla…

【MySQL】MySQL審計工具Audit Plugin安裝使用

MySQL審計工具Audit Plugin安裝使用 https://www.cnblogs.com/waynechou/p/mysql_audit.html MySQL 5.6 開啟審計功能 https://blog.51cto.com/u_15127556/4344503 MySQL之添加日志審計功能 https://blog.csdn.net/weixin_43279032/article/details/105507170 MySQL開啟日志記錄…

QT 磁盤文件 教程04-創建目錄、刪除目錄、遍歷目錄

【1】新建目錄 bool CreateDir(QString name){QString fileName name ;QDir dir(fileName);if (dir.isEmpty()) {dir.mkdir(fileName);return true;}else{qDebug()<<"文件夾已存在";return false;} } 【2】刪除目錄 bool DeleteDir(QString fileName){if (…

Git——分布式版本控制工具使用教程

本文主要介紹兩種版本控制工具——SVN和Git的概念&#xff0c;接著會講到Git的安裝&#xff0c;Git常用的命令&#xff0c;以及怎么在Vscode中使用Git。幫助新手小白快速上手Git。 1. SVN和Git介紹 1.1 SVN 集中式版本控制工具&#xff0c;版本庫是集中存放在中央服務器的&am…

Vue:添加響應式數據

Vue&#xff1a;添加響應式數據 1. 什么是響應式&#xff1f; 修改 data 后&#xff0c;頁面自動改變/刷新&#xff0c;這就是響應式。就像我們在使用 Excel 的時候&#xff0c;修改一個單元格中的數據&#xff0c;其它單元格的數據會聯動更新&#xff0c;這也是響應式。在前…

算法刷題記錄——LeetCode篇(10) [第901~1000題](持續更新)

(優先整理熱門100及面試150&#xff0c;不定期持續更新&#xff0c;歡迎關注) 994. 腐爛的橘子 在給定的 m x n 網格 grid 中&#xff0c;每個單元格可以有以下三個值之一&#xff1a; 值 0 代表空單元格&#xff1b;值 1 代表新鮮橘子&#xff1b;值 2 代表腐爛的橘子。 每…

Secs/Gem第二講 (基于secs4net項目的ChatGpt介紹)

好的&#xff0c;我們正式進入&#xff1a; 第二講&#xff1a;深入 SECS4NET 項目結構——主機程序是怎么搭起來的&#xff1f; 關鍵詞&#xff1a;項目結構、類圖、通信類、事件處理、連接生命周期、異步機制 本講目的 我們從源碼入手&#xff0c;一步步搞懂&#xff1a; S…

壓測實戰 | 微信小程序商城 “雙 11” 的壓測實踐

背景 某全球知名珠寶品牌&#xff0c;始終以創新驅動零售變革。隨著全渠道戰略的深化&#xff0c;其小程序官方商城逐漸成為品牌私域流量的核心陣地&#xff0c;不僅承載了線上銷售、會員運營等功能&#xff0c;同時還與其內部系統打通&#xff0c;如會員管理系統、人力資源系…

垃圾分類--環境配置

寫在前面&#xff1a; 如果你們打這屆比賽時&#xff0c;還有我們所保留的內存卡&#xff0c;那么插上即可運行&#xff08;因為內存卡里我們已經配置好所有的環境&#xff09; 本文提供兩種環境的配置 一種是基于yolov8&#xff1a;YOLOv8 - Ultralytics YOLO Docshttps://d…

工具(十二):Java導出MySQL數據庫表結構信息到excel

一、背景 遇到需求&#xff1a;將指定數據庫表設計&#xff0c;統一導出到一個Excel中&#xff0c;存檔查看。 如果一個一個弄&#xff0c;很復雜&#xff0c;耗時長。 二、寫一個工具導出下 廢話少絮&#xff0c;上碼&#xff1a; 2.1 pom導入 <dependency><grou…