【算法】回溯算法專題③ ——排列型回溯 python

目錄

  • 前置
  • 小試牛刀
  • 回歸經典
  • 舉一反三
  • 總結


前置


【算法】回溯算法專題① ——子集型回溯 python
【算法】回溯算法專題② ——組合型回溯 + 剪枝 python


小試牛刀


全排列 https://leetcode.cn/problems/permutations/description/


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

示例 1:

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

示例 2:

輸入:nums = [0,1]
輸出:[[0,1],[1,0]]
示例 3:

輸入:nums = [1]
輸出:[[1]]

提示:

1 <= nums.length <= 6
-10 <= nums[i] <= 10
nums 中的所有整數 互不相同

思路:

用一個vis標記數組:對已選的數字打上標記


題解:

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:n = len(nums)path = []ans = []vis = [0] * (n + 1)def dfs(i):if i == n:ans.append(path.copy())returnfor j in range(n):if not vis[j]:vis[j] = 1path.append(nums[j])dfs(i + 1)path.pop()vis[j] = 0 # 別忘了回溯時將vis打回0dfs(0)return ans

當然vis標記數組可以通過遞歸時傳入一個set參數代替


題解2:

class Solution:def permute(self, nums: List[int]) -> List[List[int]]:n = len(nums)path = []ans = []def dfs(i, s): # s:setif i == n:ans.append(path.copy())returnfor x in s:path.append(x)dfs(i + 1, s - {x})path.pop()dfs(0, set(nums)) # 用集合可以 O(1)判斷元素是否在里面return ans


回歸經典


N皇后 https://leetcode.cn/problems/n-queens/description/

按照國際象棋的規則,皇后可以攻擊與之處在同一行或同一列或同一斜線上的棋子。

n 皇后問題 研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。

給你一個整數 n ,返回所有不同的 n 皇后問題 的解決方案。

每一種解法包含一個不同的 n 皇后問題 的棋子放置方案,該方案中 ‘Q’ 和 ‘.’ 分別代表了皇后和空位。


示例 1:

在這里插入圖片描述
輸入:n = 4
輸出:[[“.Q…”,“…Q”,“Q…”,“…Q.”],[“…Q.”,“Q…”,“…Q”,“.Q…”]]
解釋:如上圖所示,4 皇后問題存在兩個不同的解法。

示例 2:

輸入:n = 1
輸出:[[“Q”]]

提示:
1 <= n <= 9


思路:

同一對角線不能有多個皇后
(可以通過計算行號加或減列號來判斷)


在這里插入圖片描述

題解code:

class Solution:def solveNQueens(self, n: int) -> List[List[str]]:ans = []col = [0] * n  # col:列vis = [0] * n  # vis:標記數組diag1 = [0] * (2 * n)diag2 = [0] * (2 * n)# 分別表示兩個對角線def dfs(r):  # row:行if r == n:ans.append(["." * c + "Q" + "." * (n - 1 - c) for c in col])returnfor c in range(n):if not vis[c] and not diag1[r + c] and not diag2[r - c]:col[r] = cvis[c] = diag1[r + c] = diag2[r - c] = 1dfs(r + 1)vis[c] = diag1[r + c] = diag2[r - c] = 0dfs(0)return ans




舉一反三


小小變化一下,可以在對角線上,但有前提: 行號至少相差3

受傷的皇后 https://www.lanqiao.cn/problems/552/learning/

在這里插入圖片描述

思路:

主要問題在于判斷相同對角線上行號之差
以(2, 2)為例:
【右對角線】 的點是 (1, 3),【左對角線】 的點是 (3, 3),
可以發現:
(2, 2)和 (1, 3)的橫坐標之差的絕對值=縱坐標之差的絕對值
同樣的(2, 2)和 (3, 3)亦是如此,
所以判斷兩點是否在同一對角線,
即判斷這兩點的橫縱坐標絕對值之差是否相等


題解code:

col = [0] * n
vis = [0] * n
diag1 = [0] * 2 * n
diag2 = [0] * 2 * ndef check(x, y):if not vis[y] and not diag1[x + y] and not diag2[x - y]:for i in range(x):if abs(i - x) == abs(col[i] - y) and abs(x - i) < 3:return 0return 1return 0def dfs(r):if r == n:global ansans += 1returnfor c in range(n):if check(r, c):col[r] = cvis[c] = diag1[r + c] = diag2[r - c] = 1dfs(r + 1)col[r] = 0vis[c] = diag1[r + c] = diag2[r - c] = 0n = int(input())
ans = 0
dfs(0)
print(ans)


總結


回溯法是一種通過嘗試每一種可能性來找到所有解的算法。對于N皇后問題,特別是帶有額外約束條件的問題(如本題中的皇后之間在同一條45度角斜線上至少相隔3行),回溯法是一個非常合適的選擇。


END
如果有更多問題或需要進一步的幫助,可以在評論區留言討論哦!
如果喜歡的話,請給博主點個關注 謝謝

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

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

相關文章

8.原型模式(Prototype)

動機 在軟件系統中&#xff0c;經常面臨著某些結構復雜的對象的創建工作&#xff1b;由于需求的變化&#xff0c;這些對象經常面臨著劇烈的變化&#xff0c;但是它們卻擁有比較穩定一致的接口。 之前的工廠方法和抽象工廠將抽象基類和具體的實現分開。原型模式也差不多&#…

LabVIEW如何高頻采集溫度數據?

在LabVIEW中進行高頻溫度數據采集時&#xff0c;選擇合適的傳感器&#xff08;如熱電偶或熱電阻&#xff09;和采集硬件是關鍵。下面是一些建議&#xff0c;幫助實現高效的溫度數據采集&#xff1a; 1. 傳感器選擇&#xff1a; 熱電偶&#xff08;Thermocouple&#xff09;&am…

Kotlin 委托詳解

Kotlin 委托詳解 引言 Kotlin 作為一種現代化的編程語言&#xff0c;在 Android 開發等領域得到了廣泛的應用。在 Kotlin 中&#xff0c;委托&#xff08;Delegation&#xff09;是一種強大的特性&#xff0c;它可以讓我們以更簡潔的方式實現代碼的復用和擴展。本文將詳細解析…

npm 和 pip 安裝中常見問題總結

安裝路徑的疑惑&#xff1a;NPM 和 PIP 的安裝機制 NPM 安裝路徑規則&#xff1a; 依賴安裝在項目目錄下&#xff1a; 當你運行 npm install --save-dev jest&#xff0c;它會在當前目錄&#xff08;例如 F:\&#xff09;下創建一個 node_modules 文件夾&#xff0c;把 jest 安…

人工智能:農業領域的變革力量

在當今科技飛速發展的時代&#xff0c;人工智能正以前所未有的態勢滲透進各個領域&#xff0c;農業也不例外。想象一下&#xff0c;未來的農田里&#xff0c;農民不再是彎腰勞作的形象&#xff0c;而是坐在高科技的“智能農場”里&#xff0c;悠閑地喝著咖啡&#xff0c;指揮著…

LLM的Deep Research功能:重構人類認知與創新的新范式

在人工智能迅速發展的今天&#xff0c;大語言模型&#xff08;LLM&#xff09;的deep research功能正在成為重構人類認知方式的關鍵力量。 這一突破性的技術進展不僅帶來了工具層面的革新&#xff0c;更深刻地觸及了人類認知能力的本質。 本文將從認知科學的視角出發&#xf…

【Cadence仿真技巧學習筆記】求解65nm庫晶體管參數un, e0, Cox

在設計放大器的第一步就是確定好晶體管參數和直流工作點的選取。通過閱讀文獻&#xff0c;我了解到L波段低噪聲放大器的mos器件最優寬度計算公式為 W o p t . p 3 2 1 ω L C o x R s Q s p W_{opt.p}\frac{3}{2}\frac{1}{\omega LC_{ox}R_{s}Q_{sp}} Wopt.p?23?ωLCox?Rs…

前端力扣刷題 | 6:hot100之 矩陣

73. 矩陣置零 給定一個 m x n 的矩陣&#xff0c;如果一個元素為 0 &#xff0c;則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。 法一&#xff1a; var setZeroes function(matrix) {let setX new Set(); // 用于存儲需要置零的行索引let setY new Set(); //…

每日一題——有效括號序列

有效括號序列 題目描述數據范圍&#xff1a;復雜度要求&#xff1a; 示例題解代碼實現代碼解析1. 定義棧和棧操作2. 棧的基本操作3. 主函數 isValid4. 返回值 時間和空間復雜度分析 題目描述 給出一個僅包含字符 (, ), {, }, [, ] 的字符串&#xff0c;判斷該字符串是否是一個…

集合通訊概覽

&#xff08;1&#xff09;通信的算法 是根據通訊的鏈路組成的 &#xff08;2&#xff09;因為通信鏈路 跟硬件強相關&#xff0c;所以每個CCL的庫都不一樣 芯片與芯片、不同U之間是怎么通信的&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 很重要…

紅黑樹的封裝

一、封裝思路 在 STL 中 map set 的底層就是封裝了一棵紅黑樹。 其中連接紅黑樹和容器的是迭代器&#xff0c;map set 暴露出的接口都不是自己寫的&#xff0c;而是紅黑樹寫的&#xff0c;外部接口封裝紅黑樹接口。 所以寫出紅黑樹為 map set 寫的接口&#xff0c;再在上層的…

java異常處理——try catch finally

單個異常處理 1.當try里的代碼發生了catch里指定類型的異常之后&#xff0c;才會執行catch里的代碼&#xff0c;程序正常執行到結尾 2.如果try里的代碼發生了非catch指定類型的異常&#xff0c;則會強制停止程序&#xff0c;報錯 3.finally修飾的代碼一定會執行&#xff0c;除…

使用QMUI實現用戶協議對話框

使用QMUI實現用戶協議對話框 懶加載用于初始化 TermServiceDialogController 對象。 懶加載 lazy var 的作用 lazy var dialogController: TermServiceDialogController {let r TermServiceDialogController()r.primaryButton.addTarget(self, action: #selector(primaryC…

C++進階: 紅黑樹及map與set封裝

紅黑樹總結整理 紅黑色概述&#xff1a; 紅黑樹整理與AVL樹類似&#xff0c;但在對樹的平衡做控制時&#xff0c;AVL樹會比紅黑樹更嚴格。 AVL樹是通過引入平衡因子的概念進行對樹高度控制。 紅黑樹則是對每個節點標記顏色&#xff0c;對顏色進行控制。 紅黑樹控制規則&…

在Qt中,slots 關鍵字有什么用?

有下面的Qt代碼&#xff1a; #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent nullptr…

列表標簽(無序列表、有序列表)

無序列表 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head><…

Kanass基礎教程-創建項目

Kanass是一款國產開源免費的項目管理工具&#xff0c;工具簡潔易用&#xff0c;開源免費&#xff0c;之前介紹過kanass的一些產品簡介及安裝配置方法&#xff0c;本文就從如何創建第一個項目來開始kanass上手之旅吧。 1. 創建項目 點擊項目->項目添加 按鈕進入項目添加頁面…

【Numpy核心編程攻略:Python數據處理、分析詳解與科學計算】2.10 ndarray內存模型:從指針到緩存優化

2.10 ndarray內存模型&#xff1a;從指針到緩存優化 目錄 #mermaid-svg-p0zxLYqAnn59O2Xe {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-p0zxLYqAnn59O2Xe .error-icon{fill:#552222;}#mermaid-svg-p0zxLYqAnn59O…

80-《紅球姜》

紅球姜 紅球姜&#xff08;學名&#xff1a;Zingiber zerumbet (L.) Smith&#xff09;是姜科姜屬多年生草本植物&#xff0c;根莖塊狀&#xff0c;株高可達2米。葉片披針形至長圓狀披針形&#xff0c;無柄或短柄&#xff1b;總花梗長可達30厘米&#xff0c;花序球果狀&#xf…

Hive之數據定義DDL

Hive之數據定義DDL 文章目錄 Hive之數據定義DDL寫在前面創建數據庫查詢數據庫顯示數據庫查看數據庫詳情切換當前數據庫 修改數據庫刪除數據庫創建表管理表(內部表)外部表管理表與外部表的互相轉換 修改表重命名表增加、修改和刪除表分區增加/修改/替換列信息 刪除表 寫在前面 …