LeetCode 46. 全排列

来源:https://www.cnblogs.com/yiluolion/archive/2020/04/26/12782495.html
-Advertisement-
Play Games

46. 全排列 題目來源: "https://leetcode cn.com/problems/permutations/" 題目 給定一個 沒有重覆 數字的序列,返回其所有可能的全排列。 示例: 解題思路 思路:深度優化搜索 先看題目,以所給數組 [1, 2, 3] 的全排列為例: 以 1 開始, ...


46. 全排列


題目來源:https://leetcode-cn.com/problems/permutations/

題目


給定一個 沒有重覆 數字的序列,返回其所有可能的全排列。

示例:

輸入: [1,2,3]
輸出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

解題思路


思路:深度優化搜索

先看題目,以所給數組 [1, 2, 3] 的全排列為例:

  • 以 1 開始,全排列有:[1,2,3], [1,3,2];
  • 以 2 開始,全排列有 [2,1,3], [2,3,1];
  • 以 3 開始,全排列有 [3,1,2], [3,2,1]。

從上面的情況,可以看出。枚舉每個每一位可能出現的情況,已選擇的數字在下麵的選擇則不能出現。按照這個做法,所有的情況將能夠羅列出來。這裡其實就是執行一次深度優先搜索,從根節點到葉子節點形成的路徑就是一個全排列。

按照這種思路,沿用上面的例子,從空列表 [] 開始,以 1 開始為例。現在確定以 1 開始,則列表為 [1],現在選擇 [2][3] 之中的一個,先選 2,最後剩下的只有數字 3,所以形成全排列 [1, 2, 3]

已知還有一種情況,也就是 [1, 3, 2],那麼如何實現從 [1, 2, 3][1, 3, 2] 的變化。深度優先搜索是如何實現的?其實是從 [1, 2, 3] 回到 [1, 2] 的情況,撤銷數字 3,因為當前層只能選擇 3,所以再撤銷 2 的選擇,這樣後面的程式則能在選擇 3 的時候後續也能選擇 2。

代碼實現


class Solution:
    def permute(self, nums: List[int]) -> List[List[int]]:

        def _dfs(nums, depth, pmt, be_selected, length, ans):
            # 表示深度優化搜索的深度等於數組長度時,這個時候表示全排列已經生成
            # 也就是符合情況的選擇已經選擇完畢
            # 將這個全排列的情況添加到列表中
            # 這裡需要註意,pmt 在參數傳遞是引用傳遞,拷貝一份添加到結果中
            if depth == length:
                ans.append(pmt[:])
                return

            # 開始遍歷
            for i in range(length):
                # be_selected,表示原數組中的元素的狀態,是否被選擇,是為 True,否為 False
                if not be_selected[i]:
                    # 當元素被選擇時,改變狀態
                    be_selected[i] = True
                    # 將元素添加到 pmt 中,以構成後續
                    pmt.append(nums[i])
                    # 向下一層進行遍歷
                    _dfs(nums, depth + 1, pmt, be_selected, length, ans)
                    # 遍歷結束時,進行回溯,這個時候狀態要進行重置
                    # 如上面說的 `[1, 2, 3]` 到 `[1, 3, 2]` 中變化,要撤銷 3,再撤銷 2,重新選擇
                    # 狀態改變
                    be_selected[i] = False
                    # 撤銷
                    pmt.pop()

        length = len(nums)
        if length == 0:
            return []

        be_selected = [False] * length
        ans = []
        _dfs(nums, 0, [], be_selected, length, ans)
        return ans

實現結果


實現結果


以上就是使用深度優化搜索的思想,解決《46. 全排列》的問題的主要內容,主要需要註意的是狀態重置。


歡迎關註微信公眾號《書所集錄》


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Flutter中如何實現沉浸式透明Statusbar狀態欄效果? 如下圖:狀態欄是指android手機頂部顯示手機狀態信息的位置。android 自4.4開始新加入透明狀態欄功能,狀態欄可以自定義顏色背景,使titleBar能夠和狀態欄融為一體,增加沉浸感。 如上圖Flutter狀態欄預設為黑色半透 ...
  • 背景 這裡的kafka值得是broker,broker消息丟失的邊界需要對齊一下: 1 已經提交的消息 2 有限度的持久化 如果消息沒提交成功,並不是broke丟失了消息; 有限度的持久化(broker可用) 生產者丟失消息 這個發送消息的方式是非同步的;fire and forget,發送而不管結果 ...
  • 本文基於 JDK1.8 闡述分析 運行過程 我們都知道 Java 源文件通過編譯器編譯後,能產生相應的 .Class 文件,也就是位元組碼文件。而位元組碼文件通過 Java 虛擬機中的解釋器,編譯成特定機器上的機器碼。 跨平臺的特性 Java 能跨平臺的原因是因為:不同的平臺有不同的 JVM 版本,一個 ...
  • 參考https://www.cnblogs.com/xenny/p/9739600.html 樹狀數組與線段樹的區別 1. 兩者在複雜度上同級, 但是樹狀數組的常數明顯優於線段樹, 其編程複雜度也遠小於線段樹. 2. 樹狀數組的作用被線段樹完全涵蓋, , 但是線段樹能夠解決的問題樹狀數組未必能夠解決 ...
  • 什麼是while迴圈: while語句也稱條件判斷語句,它的迴圈方式是利用一個條件來控制是否要繼續反覆執行這個語句。 他的語法是 while( 條件表達式){ 執行 語句 } 他的特點是:先判斷,後執行迴圈操作。 概念:一直重覆做有開始有結束的事情。 特征為: 條件:開始結束的條件。 操作:一直重覆 ...
  • npm run dev 報錯,這個錯誤好像還遇到挺多次的,這次特地記錄一下,反正錯誤翻譯過來就是模塊生成失敗:錯誤:找不到模塊“node sass” 需要堆棧:....這大概意思就是下載node sass失敗唄 我這裡是這麼做法就成功了 首先執行:npm install g cnpm registr ...
  • 1 簡介 是不安全的,我們需要給它套上 ,讓它變成 。本文章將用實例介紹 整合 。 2 密碼學基礎 要談 就要談 ,自然就要談安全;談及安全,就必然涉及密碼學的一些知識。 2.1 密碼體制 要建立一個密碼體制,需要由五個空間組成,分別是: 明文M:加密前或解密後的信息; 密文C:明文加密後的信息; ...
  • 為什麼要使用switch 迴圈結構: 因為多重if選擇結構從代碼上看的話,顯得結構複雜,容易出錯,代碼多,冗餘且有多次的等值判斷。為瞭解決上述問題,我們開發出switch選擇結構。 if選擇結構主要用於區間的判斷上如 boolean類型,switch選擇結構用於等值的判斷。 switch語法結構: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...