備戰菊廠筆試2-BFS記憶化MLE?用Set去重-Set會TLE?用SortedSet剪枝

目錄

200.島嶼數量

不用getnei,直接在dfs判斷,去掉解包

如果害怕棧溢出那么可以用bfs

2617.網格圖中最少訪問的格子數?

注意特判!

MLE主要是因為vis占用的內存過大

用SortedSet有序剪枝

什么是SortedSet?

基本性質

導入

常用操作

初始化

添加與刪除

索引(因為有序的所以支持bisect,類似于list)

范圍查詢 irange( , ) !!!

我們可以用 list + bisect 實現類似SortedSet

本題題解

官方題解

單調棧優化DP

線段樹

1702.修改后的最大二進制字符串


200.島嶼數量

很明顯的DFS連通性判斷?

遍歷地圖找1,然后開始傳染(如果不想修改原本數據集可以用vis存儲已訪問數據)

class Solution:def numIslands(self, grid):lx=len(grid)ly=len(grid[0])d=[(0,1),(0,-1),(1,0),(-1,0)]def get_nei(x,y):neis=[]for dx,dy in d:nx,ny=x+dx,y+dyif 0<=nx<lx and 0<=ny<ly:neis.append((nx,ny))#tuple方便解包return neisdef dfs(x,y):if grid[x][y]=='1':grid[x][y]='0'for nx,ny in get_nei(x,y):dfs(nx,ny)#傳染0ans=0for i in range(lx):for j in range(ly):if grid[i][j]=='1':dfs(i,j)ans+=1return ansif __name__=='__main__':grid = [["1","1","0","0","0"],["1","1","0","0","0"],["0","0","1","0","0"],["0","0","0","1","1"]]sol=Solution()#創建對象ans=sol.numIslands(grid)print(ans)

但是這樣只擊敗35%的解法

不用getnei,直接在dfs判斷,去掉解包

去掉getnei,去掉解包(解包的在數據很多時會影響時間復雜度)

def numIslands(self, grid):if not grid:return 0rows, cols = len(grid), len(grid[0])count = 0def dfs(r, c):# 邊界條件或已訪問過(水域)if r < 0 or c < 0 or r >= rows or c >= cols or grid[r][c] == '0':return# 標記為已訪問grid[r][c] = '0'# 直接檢查四個方向dfs(r+1, c)dfs(r-1, c)dfs(r, c+1)dfs(r, c-1)for i in range(rows):for j in range(cols):if grid[i][j] == '1':count += 1dfs(i, j)return count

如果害怕棧溢出那么可以用bfs

from collections import dequedef numIslands(self, grid):if not grid:return 0rows, cols = len(grid), len(grid[0])count = 0for i in range(rows):for j in range(cols):if grid[i][j] == '1':count += 1grid[i][j] = '0'  # 標記為已訪問# BFSqueue = deque([(i, j)])while queue:r, c = queue.popleft()directions = [(0, 1), (1, 0), (0, -1), (-1, 0)]for dr, dc in directions:nr, nc = r + dr, c + dcif 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1':queue.append((nr, nc))grid[nr][nc] = '0'  # 標記為已訪問return count

2617.網格圖中最少訪問的格子數?

2617. 網格圖中最少訪問的格子數

分析題目,對于x,y點可以向右或者向下,其行動能力為該節點的權值?

我剛開始還想著用DFS表示著來做,但是這復雜度也太高了!

得利用BFS逐層拓展的性質,第一次碰到就是最短

得vis記憶化:之前層走的肯定是先到的

from collections import dequeclass Solution:def minimumVisitedCells(self, grid):if grid == [[0]]:return 1lx = len(grid)ly = len(grid[0])visited = [[False] * ly for _ in range(lx)]queue = deque()queue.append((0, 0, 1))  # (x, y, 當前步數)while queue:x, y, step = queue.popleft()if visited[x][y]:continuevisited[x][y] = True# 嘗試向下跳for i in range(1, grid[x][y] + 1):nx = x + iif nx >= lx:breakif not visited[nx][y]:if nx == lx - 1 and y == ly - 1:return step + 1queue.append((nx, y, step + 1))# 嘗試向右跳for i in range(1, grid[x][y] + 1):ny = y + iif ny >= ly:breakif not visited[x][ny]:if x == lx - 1 and ny == ly - 1:return step + 1queue.append((x, ny, step + 1))return -1

注意:得在類外面導入庫!

注意特判!

起點就是終點的時候不是輸出-1,而是輸出1

        if grid==[[0]]:return 1

結果后面MLE了

(這道題不用dijkstra,因為每步代價是一樣的)

MLE主要是因為vis占用的內存過大

用set去重

用兩個二維數組,一個存儲每一行未被訪問的列,另一個存儲每一列未被訪問的行

那么就從原來的加入到 vis 變成從 set remove

from collections import dequeclass Solution:def minimumVisitedCells(self, grid):if grid == [[0]]:return 1lx = len(grid)ly = len(grid[0])#每一行未被訪問的列lie=[set(range(ly)) for i in range(lx)]hang=[set(range(lx)) for i in range(ly)]#每一列未被訪問的行lie[0].remove(0)hang[0].remove(0)queue=deque()queue.append((0,0,1))while queue:x,y,step=queue.popleft()for i in range(1,grid[x][y]+1):nx=x+iif nx>=lx:breakif nx in hang[y]:if nx==lx-1 and y==ly-1:return step+1queue.append((nx,y,step+1))hang[y].remove(nx)for i in range(1,grid[x][y]+1):ny=y+iif ny>=ly:breakif ny in lie[x]:if x==lx-1 and ny==ly-1:return step+1queue.append((x,ny,step+1))lie[x].remove(ny)return -1

但是這樣TLE了

用SortedSet有序剪枝

什么是SortedSet?

和set類似,但會保持元素始終按順序排列,支持范圍查詢和有序操作,非常適合搜索剪枝優化、模擬平衡樹等

基本性質

和set一樣不允許重復元素

元素自動排序(默認升序)

支持快速:

????????插入和刪除

? ? ? ? 查找、區間查詢、二分查找

導入

從 sortedcontainers 排序容器導入

from sortedcontainers import SortedSet  # 第三方庫,需pip安裝
常用操作
初始化
ss=SortedSet([1,9,2,8])ss=SortedSet(列表名)
添加與刪除
s.add( 元素值 )s.discard( 元素值 )
索引(因為有序的所以支持bisect,類似于list)
print(s[0])     # 輸出最小值(1)
print(s[-1])    # 輸出最大值(9)
print(s.bisect_left(5))  # 2,表示第一個 ≥5 的位置
print(s.bisect_right(5)) # 3,表示第一個 >5 的位置
范圍查詢 irange( , ) !!!
# 獲取大于等于 2 且小于等于 7 的所有元素(閉區間)
print(list(s.irange(2, 7)))  # [5, 7]
# 獲取大于 3 的元素(開區間)
print(list(s.irange(3, 9, inclusive=(False, True)))  # [5, 7, 9]

所以這題里面我們可以用 irange快速找到可以跳遠的位置

我們可以用 list + bisect 實現類似SortedSet

就是要注意列表的查重

本題題解

from collections import deque
from bisect import bisect_right
from sortedcontainers import SortedSet  # 第三方庫,需安裝class Solution:def minimumVisitedCells(self, grid):if grid == [[0]]:return 1m, n = len(grid), len(grid[0])row = [SortedSet(range(n)) for _ in range(m)]col = [SortedSet(range(m)) for _ in range(n)]queue = deque([(0, 0, 1)])row[0].discard(0)col[0].discard(0)while queue:x, y, step = queue.popleft()max_jump = grid[x][y]# 向右推進candidates = list(row[x].irange(y + 1, y + max_jump))for ny in candidates:if x == m - 1 and ny == n - 1:return step + 1queue.append((x, ny, step + 1))row[x].discard(ny)# 向下推進candidates = list(col[y].irange(x + 1, x + max_jump))for nx in candidates:if nx == m - 1 and y == n - 1:return step + 1queue.append((nx, y, step + 1))col[y].discard(nx)return -1

官方題解

和Dijkstra一樣都貪心先處理小的-最小堆

class Solution:def minimumVisitedCells(self, grid: List[List[int]]) -> int:m, n = len(grid), len(grid[0])dist = [[-1] * n for _ in range(m)]dist[0][0] = 1row, col = [[] for _ in range(m)], [[] for _ in range(n)]def update(x: int, y: int) -> int:return y if x == -1 or y < x else xfor i in range(m):for j in range(n):while row[i] and row[i][0][1] + grid[i][row[i][0][1]] < j:heapq.heappop(row[i])if row[i]:dist[i][j] = update(dist[i][j], dist[i][row[i][0][1]] + 1)while col[j] and col[j][0][1] + grid[col[j][0][1]][j] < i:heapq.heappop(col[j])if col[j]:dist[i][j] = update(dist[i][j], dist[col[j][0][1]][j] + 1)if dist[i][j] != -1:heapq.heappush(row[i], (dist[i][j], j))heapq.heappush(col[j], (dist[i][j], i))return dist[m - 1][n - 1]

單調棧優化DP

class Solution:def minimumVisitedCells(self, grid: List[List[int]]) -> int:m, n = len(grid), len(grid[0])col_stacks = [[] for _ in range(n)]  # 每列的單調棧for i in range(m - 1, -1, -1):row_st = []  # 當前行的單調棧for j in range(n - 1, -1, -1):g = grid[i][j]col_st = col_stacks[j]mn = inf if i < m - 1 or j < n - 1 else 1if g:  # 可以向右/向下跳# 在單調棧上二分查找最優轉移來源k = bisect_left(row_st, -(j + g), key=lambda p: p[1])if k < len(row_st):mn = row_st[k][0] + 1k = bisect_left(col_st, -(i + g), key=lambda p: p[1])if k < len(col_st):mn = min(mn, col_st[k][0] + 1)if mn < inf:# 插入單調棧while row_st and mn <= row_st[-1][0]:row_st.pop()row_st.append((mn, -j))  # 保證下標單調遞增,方便調用 bisect_leftwhile col_st and mn <= col_st[-1][0]:col_st.pop()col_st.append((mn, -i))  # 保證下標單調遞增,方便調用 bisect_leftreturn mn if mn < inf else -1  # 最后一個算出的 mn 就是 f[0][0]

線段樹

區間查詢+單點更新

import sys
sys.setrecursionlimit(1 << 25)INF = float('inf')class SegmentTree:def __init__(self, size):self.N = sizeself.tree = [INF] * (4 * size)def update(self, o, l, r, idx, val):if l == r:self.tree[o] = valreturnm = (l + r) // 2if idx <= m:self.update(o * 2, l, m, idx, val)else:self.update(o * 2 + 1, m + 1, r, idx, val)self.tree[o] = min(self.tree[o * 2], self.tree[o * 2 + 1])def query(self, o, l, r, L, R):if L > R:return INFif L <= l and r <= R:return self.tree[o]m = (l + r) // 2res = INFif L <= m:res = min(res, self.query(o * 2, l, m, L, R))if R > m:res = min(res, self.query(o * 2 + 1, m + 1, r, L, R))return resclass Solution:def minimumVisitedCells(self, grid):m, n = len(grid), len(grid[0])minl = [SegmentTree(m) for _ in range(n)]  # 每一列的線段樹ans = INFfor i in reversed(range(m)):minh = SegmentTree(n)  # 當前行的線段樹for j in reversed(range(n)):mn = INFg = grid[i][j]if i == m - 1 and j == n - 1:mn = 1if j + 1 <= min(j + g, n - 1):mn = min(mn, minh.query(1, 1, n, j + 2, min(j + g + 1, n)) + 1)if i + 1 <= min(i + g, m - 1):mn = min(mn, minl[j].query(1, 1, m, i + 2, min(i + g + 1, m)) + 1)if mn < INF:minh.update(1, 1, n, j + 1, mn)minl[j].update(1, 1, m, i + 1, mn)if i == 0 and j == 0:ans = mnreturn -1 if ans == INF else ans

1702.修改后的最大二進制字符串

1702. 修改后的最大二進制字符串

猜了一波然后錯了?

        '''猜錯了!l=len(binary)if binary=='01':return '01'if int(binary)==0:s='1'*(l-1)+'0'return sif sum(map(int,list(binary)))==l:return binaryx=int(l/2)s='1'*x+'0'+'1'*(l-x-1)return s'''

然后我開始觀察這兩個操作對二進制串的影響

操作1.將00轉為10,可以變大

操作2.將10轉為01,這會變小啊?

所以操作2存在的意義就是為了操作1 :將0往前推,從而產生操作1的條件

于是自以為是的我就直接把0全往開頭放然后進行操作1

        '''c0=binary.count('0')#特判!!????if c0==1:return binaryif c0==0:return binaryc1=binary.count('1')s='1'*(c0-1)+'0'+'1'*c1return s'''

但是有沒有一種可能原本前面1呆的好好的被你往后推了?

比如111000變成000111變成

? ? ? ? 110111,明顯變小了因為第三位的變化,所以這是明顯不可取的

我們得從第一個0開始變

class Solution:def maximumBinaryString(self, binary: str) -> str:l=len(binary)c0=bianry.count('0')c1=binary.count('1')if c0==0:return binaryfor i in range(l):#找第一個0if binary[i]=='0':x=ibreakc12=c1-xs=x*'1'+'1'*(c0-1)+'0'+'1'*c12return s

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

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

相關文章

STM32H743輸出50%的占空比波形

使用cubeMX進行配置如下&#xff1a; 時鐘配置如下&#xff1a; 具體代碼如下&#xff1a; /* USER CODE BEGIN Header */ /********************************************************************************* file : main.c* brief : Main program b…

MYSQL 查詢去除小數位后多余的0

MYSQL 查詢去除小數位后多余的0 在MySQL中&#xff0c;有時候我們需要去除存儲在數據庫中的數字字段小數點后面多余的0。這種情況通常發生在處理金額或其他需要精確小數位的數據時。例如&#xff0c;數據庫中存儲的是decimal (18,6)類型的數據&#xff0c;但在頁面展示時不希望…

物理:從人體組成角度能否說明基本粒子的差異性以及組織結構的可預設性?

人類的個體差異源于粒子組合的復雜性、環境與隨機性的相互作用,而非基本粒子本身的差異性。以下分層次解析: 一、基本粒子的同質性與組合多樣性 1. 基本粒子的同一性 標準模型確認:同種類基本粒子(如電子、上夸克)具有完全相同的質量、電荷等屬性,不存在個體差異。泡利不…

應用探析|千眼狼PIV測量系統在職業病防治中的應用

1、職業病防治背景 隨著《職業病防治法》及各省市“十四五”職業病防治規劃的深入推進&#xff0c;工作場所粉塵危害監測與防控已成為疾控部門的核心任務。以礦山、建材、冶金、化工等行業為例&#xff0c;粉塵濃度、分布及傳播特性的精準測量是評估職業病風險的關鍵。 傳統的…

串口模塊詳細講解

目錄 1.串口介紹 2。STC-ISP串口功能介紹 3.接口及引腳定義 4.串口知識點 4.1 硬件電路 4.2 電平標準 4.3 相關術語 4.4 常見通信接口比較 4.5 51單片機的UART 4.6 串口參數及時序圖 4.7 串口模式圖 4.8 串口和中斷系統 4.9 串口相關寄存器 5.串口向電腦發送信息…

基于大模型的腰椎管狹窄術前、術中、術后全流程預測與治療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 二、腰椎管狹窄概述 2.1 定義與分類 2.2 發病原因與機制 2.3 臨床表現與診斷方法 三、大模型技術原理與應用現狀 3.1 大模型的基本原理 3.2 在醫療領域的應用案例 3.3 選擇大模型預測腰椎管狹窄的依據 四、…

【2025年前端高頻場景題系列】使用同一個鏈接,如何實現PC打開是web應用、手機打是-個H5 應用?

面試情境與問題引入 哈嘍大家伙,我是布魯伊。在前端開發面試中,面試官經常會拋出一些看似簡單卻能考察多方面能力的問題。"如何實現同一個鏈接在PC端和移動端展示不同應用?"就是這樣一個典型問題。為什么面試官喜歡問這個問題?因為它能同時考察候選人的設備適配…

醫療實時操作系統方案:手術機器人的微秒級運動控制

一、引言 手術機器人作為現代醫療技術的重要突破&#xff0c;正不斷推動著外科手術向精準化、微創化和智能化的方向發展。直覺外科&#xff08;Intuitive Surgical&#xff09;作為手術機器人領域的領軍企業&#xff0c;其達芬奇手術機器人系統已被廣泛應用于全球眾多醫療機構…

數據結構基礎--藍橋杯備考

1.優缺點總述 STL中各容器對比圖 各類線性數據結構優缺點 1.數組 1.優點 1.簡單&#xff0c;容易理解 2.訪問快捷&#xff0c;只需要用下標就可以 3.有某些應用場景直接對應&#xff0c;例如二維數組對應平面 2.缺點 刪除和插入數據非常耗時 2.鏈表 1.優點 插入和刪…

運用數組和矩陣對數據進行存取和運算——NumPy模塊 之六

目錄 NumPy模塊介紹 3.6.1 數組之間的運算 3.6.2 算術運算 3.6.3 比較運算 3.6.4 邏輯運算 3.6.5 矩陣運算 3.6.6 廣播運算 3.6.7 聚合運算 3.6.8 三角函數與指數對數運算 3.6.9 位運算 3.6.10 條件運算 3.6.11 數組的統計運算 3.6.12 關鍵問題:數組之間的運算對數組的維度有要…

JGL066生活垃圾滾筒篩分選機實驗裝置

JGL066生活垃圾滾筒篩分選機實驗裝置 一.實驗目的 本實驗對生活垃圾滾筒分選機進行垃圾分選的實驗。通過實驗達到以下目的&#xff1a; 1.了解分選的原理、方法和影響分選效果的主要因素。 2.確定分選的適宜條件。 二.技術指標 1.生活垃圾分選機處理量分為0.5~2t/h。 2.運動參數…

Excelize 開源基礎庫發布 2.9.1 版本更新

Excelize 是 Go 語言編寫的用于操作 Office Excel 文檔基礎庫&#xff0c;基于 ECMA-376&#xff0c;ISO/IEC 29500 國際標準。可以使用它來讀取、寫入由 Excel、WPS、OpenOffice 等辦公軟件創建的電子表格文檔。支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多種文檔格式&#xf…

xss-labs靶場基礎8-10關(記錄學習)

前言&#xff1a; 內容&#xff1a; 第八關 關卡資源網站&#xff0c;html編碼網站&#xff08;兩個網站&#xff0c;一個是實體編號轉義&#xff08;只對特殊字符有效&#xff0c;字母無效&#xff09;、實體符號轉義&#xff09; 在線Html實體編碼解碼-HTML Entity Encodi…

Kafka topic 中的 partition 數據傾斜問題

在 Kafka 中&#xff0c;如果一個 Topic 有多個 Partition&#xff0c;但這些 Partition 中的消息數量或流量分布不均衡&#xff0c;就會出現 數據傾斜&#xff08;Data Skew&#xff09; 的問題。 ? 什么是數據傾斜&#xff1f; 數據傾斜指的是&#xff1a; 某些 Partitio…

Retrofit vs Feign: 介紹、對比及示例

1. 介紹 Retrofit Retrofit 是 Square 公司開發的一個類型安全的 HTTP 客戶端庫&#xff0c;主要用于 Android 和 Java 應用。它將 HTTP API 轉換為 Java 接口&#xff0c;通過注解來描述 HTTP 請求。 主要特點: 基于注解的 API 定義支持同步和異步調用支持多種數據格式轉換…

SpringBoot整合MyBatis-Plus:零XML實現高效CRUD

前言 作為一名開發者&#xff0c;數據庫操作是我們日常工作中不可或缺的部分。傳統的MyBatis雖然強大&#xff0c;但需要編寫大量XML映射文件&#xff0c;這在快速開發的今天顯得效率不足。MyBatis-Plus&#xff08;簡稱MP&#xff09;作為MyBatis的增強工具&#xff0c;在保留…

SpringCloud之Gateway基礎認識-服務網關

0、Gateway基本知識 Gateway 是在 Spring 生態系統之上構建的 API 網關服務&#xff0c;基于 Spring &#xff0c;Spring Boot 和 Project Reactor 等技術。 Gateway 旨在提供一種簡單而有效的方式來對 API 進行路由&#xff0c;以及提供一些強大的過濾器功能&#xff0c;例如…

Redis掃盲

Redis 緩存中間件 基礎篇 鍵值數據庫 key Value 是NoSql數據庫 非結構化、無關聯的、非SQL、BASE&#xff08;無法滿足ACID&#xff09; 命令執行是單線程&#xff0c;符合原子性。 低延遲、速度塊&#xff08;基于內存&#xff0c;IO多路復用&#xff0c;良好的編碼&am…

【FMMT】基于模糊多模態變壓器模型的個性化情感分析

遇到很難的文獻看不懂,不應該感到氣餒,應該激動,因為外審估計也看不太懂,那么學明白了可以嚇唬他 缺陷一:輸入依賴性與上下文建模不足?? ??缺陷描述??: 傳統自注意力機制缺乏因果關系,難以捕捉序列歷史背景多模態數據間的復雜依賴關系未被充分建模CNN/RNN類模型在…

Qt Creator 配置 Android 編譯環境

Qt Creator 配置 Android 編譯環境 環境配置流程下載JDK修改Qt Creator默認android配置文件修改sdk_definitions.json配置修改的內容 Qt Creator配置 異常處理刪除提示占用編譯報錯連接安卓機調試APP閃退無法進入 debug 斷點 環境 Qt Creator 版本 qtcreator-16.0.1Win10 嗯, …