【力扣hot100】刷題筆記Day19

前言

  • 回溯回溯回溯!早上整理檔案竟然用了桶排序,不愧是算法狂魔們

79. 單詞搜索 - 力扣(LeetCode)

  • DFS

    • class Solution:def exist(self, board: List[List[str]], word: str) -> bool:m, n = len(board), len(board[0])# used = [[0] * n for _ in range(m)]word_len = len(word)self.flag = Falsedef dfs(x, y, index):if index == word_len:self.flag = Truereturnfor x0, y0 in ((x-1, y), (x, y-1), (x+1, y), (x,y+1)):# if 0 <= x0 < m and 0 <= y0 < n and board[x0][y0] == word[index] and used[x0][y0] == 0:if 0 <= x0 < m and 0 <= y0 < n and board[x0][y0] == word[index]:# used[x0][y0] = 1board[x0][y0] = ''           # 置為空字符避免重復dfs(x0, y0, index+1)board[x0][y0] = word[index]  # 回溯# used[x0][y0] = 0for i in range(len(board)):for j in range(len(board[0])):if board[i][j] == word[0]:# used[i][j] = 1board[i][j] = ''        # 置為空字符避免重復dfs(i, j, 1)board[i][j] = word[0]   # 回溯# used[i][j] = 0if self.flag: return self.flag  # 剪枝,找到一條就可以退出了return self.flag

?131. 分割回文串 - 力扣(LeetCode)

  • 回溯(分割)

    • 動規判斷回文串的方法看【代碼隨想錄】刷題筆記Day54-CSDN博客
    • class Solution:def partition(self, s: str) -> List[List[str]]:# # 雙指針判斷是否回文串# def isPalindrome(s, left, right):#     while s[left] == s[right]:#         left += 1#         right -= 1#         if left >= right: return True#     return False  # # 優化:動規法判斷回文串# def computePalindrome(s, isPalindrome):#     for i in range(len(s) - 1, -1, -1):  # 需要倒序計算,保證在i行時,i+1行已經計算好了#         for j in range(i, len(s)):#             if j == i:#                 isPalindrome[i][j] = True#             elif j - i == 1:#                 isPalindrome[i][j] = (s[i] == s[j])#             else:#                 isPalindrome[i][j] = (s[i] == s[j] and isPalindrome[i+1][j-1]) # isPalindrome = [[False] * len(s) for _ in range(len(s))]  # 初始化isPalindrome矩陣# computePalindrome(s, isPalindrome)  # 到時候直接查,isPalindrome[i][j]代表s[i:j]閉區間是否是回文字串path = []res = []n = len(s)def backtrack(start = 0):if start == n:res.append(path[:])for i in range(start, n):# if isPalindrome(s, start, i):  # 利用雙指針判斷回文if s[start:i+1] == s[start:i+1][::-1]:  # 利用python特性直接判斷回文# if isPalindrome[start][i]:   # 利用動規預先存好的dp數組判斷回文path.append(s[start:i+1])backtrack(i+1)path.pop()backtrack()return res

分割補充

?93. 復原 IP 地址 - 力扣(LeetCode)

  • class Solution:def restoreIpAddresses(self, s: str) -> List[str]:# 送進來的是1~3位字符串def isValid(s):if s[0] != '0' and 1 <= int(s) <= 255:return Trueelif len(s) == 1 and int(s) == 0:return Trueelse:return Falsepath = []res = []n = len(s)def backtrack(start = 0):if start == n and len(path) == 4:res.append(".".join(path))for i in range(start, start + 3):  # 只要往后3位if i < n:  # 不要越界# 剪枝:剩余字符數 > 3*割完后剩下要割的數量if n - i - 1 > 3 * (3 - len(path)):continuetmp = s[start:i+1]if isValid(tmp):path.append(tmp)backtrack(i+1)path.pop()backtrack()return res

?51. N 皇后 - 力扣(LeetCode)

  • 回溯(占坑)

    • 自己寫出來的,成就感max,雖然蠢但是還想記錄下來
    • class Solution:def solveNQueens(self, n: int) -> List[List[str]]:used = [[0] * n for _ in range(n)]  # 0代表可放,大于1表示不可放path = []res = []def backtrack(row = 0):if row == n:res.append(path[:])returnfor col in range(n):if used[row][col] == 0:tmp = col*'.' + 'Q' + (n-col-1)*'.'path.append(tmp) # 往下占坑l_col = r_col = colfor row_now in range(row+1, n):l_col -= 1  r_col += 1  used[row_now][col] += 1  # 正下方if l_col >= 0: used[row_now][l_col] += 1  # 左斜向下if r_col <= n-1: used[row_now][r_col] += 1  # 右斜向下# 進入下一行backtrack(row+1)# 回溯退坑l_col = r_col = colfor row_now in range(row+1, n):l_col -= 1r_col += 1used[row_now][col] -= 1  # 正下方if l_col >= 0: used[row_now][l_col] -= 1  # 左斜向下if r_col <= n-1: used[row_now][r_col] -= 1  # 右斜向下path.pop()backtrack()return res
  • ?回溯(合法)

    • class Solution:def solveNQueens(self, n: int) -> List[List[str]]:# 從上往下放棋子# 按照row從小到大放置皇后board = [['.'] * n for _ in range(n)]res = []# 表示board中小于row的那些行(row上面的那些行)已經放置皇后了# 這一步開始往第row行放皇后def backtrack(row):n = len(board)# 如果到最后一行了,則將結果添加到res里if row == n:tmp = [''.join(i) for i in board]res.append(tmp)returnfor col in range(n):if not self.isValid(board, row, col):continueboard[row][col] = 'Q'backtrack(row + 1)board[row][col] = '.'backtrack(0)return res # 查看是否可以在board[row][col]的位置放置皇后def isValid(self, board, row, col):n = len(board)# 查看上方是否有Qfor i in range(row):if board[i][col] == 'Q':return False# 查看右上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col + 1, n, 1)):if board[i][j] == 'Q':return False# 查看左上方是否有Qfor i, j in zip(range(row - 1, -1, -1), range(col - 1, -1, -1)):if board[i][j] == 'Q':return Falsereturn True 

棋盤補充?

37. 解數獨 - 力扣(LeetCode)

  • 回溯(雙重遞歸 + 合法判斷)

    • class Solution:def solveSudoku(self, board: List[List[str]]) -> None:"""Do not return anything, modify board in-place instead."""self.backtracking(board)def backtracking(self, board: List[List[str]]) -> bool:# 若有解,返回True;若無解,返回Falsefor i in range(len(board)): # 遍歷行for j in range(len(board[0])):  # 遍歷列# 若空格內已有數字,跳過if board[i][j] != '.': continuefor k in range(1, 10):if self.is_valid(i, j, k, board):board[i][j] = str(k)if self.backtracking(board): return Trueboard[i][j] = '.'# 若數字1-9都不能成功填入空格,返回False無解return Falsereturn True # 有解def is_valid(self, row: int, col: int, val: int, board: List[List[str]]) -> bool:# 判斷同一行是否沖突for i in range(9):if board[row][i] == str(val):return False# 判斷同一列是否沖突for j in range(9):if board[j][col] == str(val):return False# 判斷同一九宮格是否有沖突start_row = (row // 3) * 3start_col = (col // 3) * 3for i in range(start_row, start_row + 3):for j in range(start_col, start_col + 3):if board[i][j] == str(val):return Falsereturn True
  • 回溯(剩余數字set取交集)?

    • class Solution:def solveSudoku(self, board: List[List[str]]) -> None:row = [set(range(1, 10)) for _ in range(9)]  # 行剩余可用數字col = [set(range(1, 10)) for _ in range(9)]  # 列剩余可用數字block = [set(range(1, 10)) for _ in range(9)]  # 塊剩余可用數字empty = []  # 收集需填數位置for i in range(9):for j in range(9):if board[i][j] != '.':  # 更新可用數字val = int(board[i][j])row[i].remove(val)col[j].remove(val)block[(i // 3)*3 + j // 3].remove(val)else:empty.append((i, j))def backtrack(iter=0):if iter == len(empty):  # 處理完empty代表找到了答案return Truei, j = empty[iter]b = (i // 3)*3 + j // 3for val in row[i] & col[j] & block[b]:  # set取交集row[i].remove(val)col[j].remove(val)block[b].remove(val)board[i][j] = str(val)if backtrack(iter+1):return Truerow[i].add(val)  # 回溯col[j].add(val)block[b].add(val)return Falsebacktrack()

后言

  • 回溯搞定!!感覺模板已經有印在腦子里了,希望下次遇到還能寫。另外,自己寫出N皇后和看最后很優雅的數獨set的方法真的顱內高潮了,這就是刷題的正反饋吧!?

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

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

相關文章

mysql timestamp轉換為datetime

MySQL timestamp轉換為datetime的方法 1. 流程概述 在MySQL中&#xff0c;timestamp和datetime是兩種不同的數據類型。timestamp存儲了日期和時間&#xff0c;并且會自動更新&#xff0c;可以用于記錄數據的創建和修改時間。datetime則是一個固定的日期和時間&#xff0c;不會自…

談談高并發系統的設計方法論

談談高并發系統的設計方法論 何為高并發系統&#xff1f;什么是并發&#xff08;Conurrent&#xff09;&#xff1f;什么是高并發&#xff08;Hight Concurrnet&#xff09;&#xff1f;高并發的衡量指標有哪些&#xff1f; 實現高并發系統的兩大板塊高并發系統應用程序側的設計…

騰訊云學生服務器使用教程_申請騰訊云學生機詳細流程

2024年騰訊云學生服務器優惠活動「云校園」&#xff0c;學生服務器優惠價格&#xff1a;輕量應用服務器2核2G學生價30元3個月、58元6個月、112元一年&#xff0c;輕量應用服務器4核8G配置191.1元3個月、352.8元6個月、646.8元一年&#xff0c;CVM云服務器2核4G配置842.4元一年&…

還在用Jenkins?快來試試這款簡而輕的自動部署軟件!

最近發現了一個比 Jenkins 使用更簡單的項目構建和部署工具&#xff0c;完全可以滿足個人以及一些小企業的需求&#xff0c;分享一下。 Jpom 是一款 Java 開發的簡單輕量的低侵入式在線構建、自動部署、日常運維、項目監控軟件。 日常開發中&#xff0c;Jpom 可以解決下面這些…

Nginx的多線程支持探究

文章中心思想: Nginx本身并不直接支持多線程處理模型。它采用的是基于事件驅動的單線程或多進程架構,而非多線程模型。然而,通過Nginx的模塊和第三方擴展,可以實現類似多線程的并發處理效果。 詳細說明: Nginx,作為一款高性能的Web服務器和反向代理服務器,其架構和并發…

章節二、three.js開發入門與調試設置02;

一、軌道控制器查看物體&#xff1b; 1、基本概念 軌道控制器&#xff08;OrbitControls&#xff09;可以使得相機圍繞目標進行軌道運動&#xff1b; 2、代碼樣例 // 七、創建軌道控制器&#xff08;相機圍繞著物體捕捉視角&#xff09; const controls new OrbitControls(c…

吳恩達機器學習全課程筆記第五篇

目錄 前言 P80-P85 添加數據 遷移學習 機器學習項目的完整周期 公平、偏見與倫理 P86-P95 傾斜數據集的誤差指標 決策樹模型 測量純度 選擇拆分方式增益 使用分類特征的一種獨熱編碼 連續的有價值特征 回歸樹 前言 這是吳恩達機器學習筆記的第五篇&#xff0c…

《2023跨境電商投訴大數據報告》發布|亞馬遜 天貓國際 考拉海購 敦煌網 阿里巴巴

2023年&#xff0c;跨境電商API接口天貓國際、京東國際和抖音全球購以其強大的品牌影響力和市場占有率&#xff0c;穩坐行業前三的位置。同時&#xff0c;各大跨境電商平臺消費糾紛問題層出不窮。依據國內知名網絡消費糾紛調解平臺“電訴寶”&#xff08;315.100EC.CN&#xff…

javaEE--后端環境變量配置

目錄 pre 文件準備 最終運行成功結果 后端運行步驟 1.修改setenv文件 2.運行setenv&#xff0c;設置環境變量 3.查看jdk版本 4.修改mysql文件夾下的my文件 前端運行步驟 1.nodejs環境配置 2.查看node和npm版本 3.下載并運行npm 4.注冊登錄 pre 文件準備 最終運行…

VR轉接器:破解虛擬與現實邊界的革命性設備

VR轉接器&#xff0c;這一革命性的設備&#xff0c;為虛擬現實體驗帶來了前所未有的自由度。它巧妙地連接了虛擬與現實&#xff0c;使得用戶在享受VR眼鏡帶來的奇幻世界的同時&#xff0c;也能自由地在現實世界中活動。這一設計的誕生&#xff0c;不僅解決了VR眼鏡續航的瓶頸問…

2、云原生安全之可視化界面rancher的部署

文章目錄 1、rancher的部署1.1、安裝rancher1.2、配置k8s2、部署helm3、容器安全工具neuvector此時已經部署好了k8s,使用rancher來管理 rancher簡化了使用k8s的流程,可以圖形化管理k8s。 參考: https://blog.51cto.com/u_15343792/5000311https://docs.rancher.cn/docs/ra…

你們團隊是否有RocketMQ創建Topic、GID創建規范呢

這里是weihubeats,覺得文章不錯可以關注公眾號小奏技術 背景 早期在使用RocketMQ的時候&#xff0c;系統和開發人員不算多。所以topic的創建會非常隨意&#xff0c;各種千奇百怪的topic 比如: order_topic、ORDER_TOPIC、order-topic 各種奇奇怪怪的風格&#xff0c;用_的&a…

GO結構體

1. 結構體 Go語言可以通過自定義的方式形成新的類型&#xff0c;結構體就是這些類型中的一種復合類型&#xff0c;結構體是由零個或多個任意類型的值聚合成的實體&#xff0c;每個值都可以稱為結構體的成員。 結構體成員也可以稱為“字段”&#xff0c;這些字段有以下特性&am…

JS清空數組方法

清空數組的方法有多種&#xff0c;以下是幾種常見的方式&#xff1a; 1.使用 array.length 屬性將數組的長度設為0&#xff0c;這樣會移除數組中的所有元素&#xff1a; var arr [1, 3, 5]; arr.length 0; console.log(arr); // [] 2. 使用 array.splice() 方法&#xff0c;…

STM32 | 零基礎 STM32 第一天

零基礎 STM32 第一天 一、認知STM32 1、STM32概念 STM32:意法半導體基于ARM公司的Cortex-M內核開發的32位的高性能、低功耗單片機。 ST:意法半導體 M:基于ARM公司的Cortex-M內核的高性能、低功耗單片機 32&#xff1a;32位單片機 2、STM32開發的產品 STM32開發的產品&a…

【論文筆記】Improving Language Understanding by Generative Pre-Training

Improving Language Understanding by Generative Pre-Training 文章目錄 Improving Language Understanding by Generative Pre-TrainingAbstract1 Introduction2 Related WorkSemi-supervised learning for NLPUnsupervised pre-trainingAuxiliary training objectives 3 Fra…

Java 網絡面試題解析

1. Http 協議的狀態碼有哪些&#xff1f;含義是什么&#xff1f;【重點】 200&#xff1a;OK&#xff0c;客戶端請求成功。 301&#xff1a;Moved Permanently&#xff08;永久移除&#xff09;&#xff0c;請求的URL已移走。Response中應該包含一個Location URL&#xff0c;…

steam++加速問題:出現顯示443端口被 vmware-hostd(9860)占用的錯誤。

目錄 前言&#xff1a; 正文&#xff1a; 前言&#xff1a; 使用Steam對GitHub進行加速處理時&#xff0c;建議使用2.8.6版本。 下載地址如下&#xff1a;Release 2.8.6 BeyondDimension/SteamTools GitHub 下載時注意自己的系統位數 正文&#xff1a; 使用GitHub時會使…

NOC2023軟件創意編程(學而思賽道)python初中組初賽真題

軟件創意編程 一、參賽范圍 1.參賽組別:小學低年級組(1-3 年級)、小學高年級組(4-6 年級)、初中組。 2.參賽人數:1 人。 3.指導教師:1 人(可空缺)。 4.每人限參加 1 個賽項。 組別確定:以地方教育行政主管部門(教委、教育廳、教育局) 認定的選手所屬學段為準。 二、…

Mybatis-Plus+SpringBoot多數據源注解方式@DS

前言 最近接到一個新需求需要處理多數據源的問題 &#xff0c;今天就來和大家一起學習一下。 一、使用步驟 1.引入庫 代碼如下&#xff08;示例&#xff09;&#xff1a; <!--配置多數據源--><dependency><groupId>com.baomidou</groupId><artif…