遍历布尔型二维数组,仅保留最大连续1的二维连通块
处理二维网格,保留最大连通▓▓区域的解决方案
这问题我之前做过类似的,给你梳理下清晰的解决思路和可落地的实现步骤:
核心思路概述
我们需要先识别出网格中所有的连通▓▓区域,统计每个区域的大小,然后只保留最大的那个区域,其余所有▓▓都转为░░。
具体步骤拆解
1. 给每个连通区域打唯一标记
遍历整个网格,每当遇到一个未被标记的▓▓(原始值为1),就用**BFS(广度优先搜索)或者DFS(深度优先搜索)**遍历它的所有连通单元格,给这些单元格分配一个唯一的区域编号(比如从2开始,避免和原始的0、1混淆),同时记录每个编号对应的区域单元格数量。
举个Python代码片段示例:
import collections def mark_regions(grid): rows, cols = len(grid), len(grid[0]) region_id = 2 region_sizes = {} # 键:区域编号,值:区域大小 for i in range(rows): for j in range(cols): if grid[i][j] == 1: # 找到未标记的▓▓ # BFS遍历连通区域 queue = collections.deque() queue.append((i, j)) grid[i][j] = region_id size = 1 while queue: x, y = queue.popleft() # 检查上下左右四个方向 for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]: nx, ny = x + dx, y + dy if 0 <= nx < rows and 0 <= ny < cols and grid[nx][ny] == 1: grid[nx][ny] = region_id size += 1 queue.append((nx, ny)) region_sizes[region_id] = size region_id += 1 return grid, region_sizes
2. 找出最大的区域编号
遍历region_sizes字典,找到值最大的那个键(也就是最大区域的编号)。如果有多个区域大小相同且都是最大值,随便选一个即可(比如选第一个遇到的)。
示例代码:
def find_largest_region(region_sizes): if not region_sizes: return None # 没有任何▓▓区域 # 按区域大小排序,取最大的那个编号 return max(region_sizes, key=region_sizes.get)
3. 保留最大区域,其余转为░░
再次遍历网格,把所有不等于最大区域编号的单元格都设为0(░░),等于的设为1(▓▓)。
示例代码:
def keep_largest_region(grid, largest_id): rows, cols = len(grid), len(grid[0]) for i in range(rows): for j in range(cols): if grid[i][j] == largest_id: grid[i][j] = 1 else: grid[i][j] = 0 return grid
整合调用示例
把上面的函数串起来,就能完成整个处理流程:
# 示例输入网格(░░=0,▓▓=1) sample_grid = [ [1, 1, 0, 0, 0], [1, 1, 0, 1, 1], [0, 0, 0, 1, 1], [1, 0, 0, 0, 0], [1, 1, 0, 0, 1] ] # 步骤1:标记区域并统计大小 marked_grid, sizes = mark_regions(sample_grid) # 步骤2:找最大区域编号 largest_id = find_largest_region(sizes) # 步骤3:保留最大区域 result_grid = keep_largest_region(marked_grid, largest_id) # 打印结果(用▓▓和░░展示) for row in result_grid: print(''.join(['▓▓' if cell == 1 else '░░' for cell in row]))
这段代码运行后,就会只保留网格中单元格数量最多的那个连通▓▓区域,其余都变成░░。
内容的提问来源于stack exchange,提问作者Nikedemos
相关产品推荐
相关产品推荐

