下記の問題のコードで殆ど差のないコードなのにタイムアウトが出てしまい、完答できません。
大きな差分箇所は、stackかqueueの違いです。queueをstackを利用するように書き換えると、処理スピードが改善されるところまでは確認できています。
しかし、なぜ改善されるのかの理由がいまだにわかりません。もし、お気づきの点ありましたらご教示いただけませんしょうか?
Given an m x n 2D binary grid grid which represents a map of '1's (land) and '0's (water), return the number of islands.
An island is surrounded by water and is formed by connecting adjacent lands horizontally or vertically. You may assume all four edges of the grid are all surrounded by water.
タイムアウトしまうコード
python
1from collections import deque 2 3 4class Solution: 5 def numIslands(self, grid: List[List[str]]) -> int: 6 m = len(grid) 7 n = len(grid[0]) 8 9----------差分箇所 10 idx_list = deque() 11 for r in range(m): 12 for c in range(n): 13 if grid[r][c] == "1": 14 idx_list.append((r, c)) 15----------- 16 islands = 0 17 while idx_list: 18 islands += 1 19 20----------差分箇所 21 q = deque([idx_list.popleft()]) 22---------- 23 while q: 24 r, c = q.popleft() 25 edge_index = [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)] 26 for r, c in edge_index: 27 if (r, c) in idx_list: 28 q.append((r, c)) 29 idx_list.remove((r, c)) 30 return islands 31
処理スピードが改善されたコード
python
1 from collections import deque 2 3class Solution: 4 def numIslands(self, grid: List[List[str]]) -> int: 5 if not grid: 6 return 0 7 8----------差分箇所 9 grid_index = set( 10 (r, c) 11 for r in range(len(grid)) 12 for c in range(len(grid[0])) 13 if grid[r][c] == "1" 14 ) 15---------- 16 17 island = 0 18 while grid_index: 19 island += 1 20----------差分箇所 21 queue = deque([grid_index.pop()]) 22---------- 23 while queue: 24 r, c = queue.popleft() 25 26 edge_index = [(r - 1, c), (r + 1, c), (r, c - 1), (r, c + 1)] 27 for edge in edge_index: 28 if edge in grid_index: 29 grid_index.remove(edge) 30 queue.append(edge) 31 return island 32
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/25 08:36
2021/09/26 05:34