统计与至少一个其他节点同行或同列的节点数量
问题分析与优化方案
你需要统计网格中至少与另一个1处于同一行或同一列的1的数量,你的实现思路是可行的,但在可读性和效率上还有优化空间,以下是具体分析和改进方案:
原代码回顾
grid=[[0,0,0,0],[1,1,1,1],[0,0,0,1],[0,0,1,1],[0,0,0,1]] rowlen=len(grid) collen=len(grid[0]) rd={i: 0 for i in range(rowlen)} cd={i: 0 for i in range(collen)} cl=[] rl=[] for (rowi, row) in enumerate(grid): for (coli,x) in enumerate(row): if x>0: cd[coli]=cd[coli]+1 rd[rowi]=rd[rowi]+1 cl.append(coli) rl.append(rowi) coords=zip(rl,cl) coordslist=list(coords) bools=[int(bool(((rd[a]-1) or (cd[b]-1)))) for (a,b) in coordslist] answer=sum(bools)
优化点说明
- 用列表替代字典存行列计数:行和列的索引是连续的0到长度-1,列表的访问、更新效率比字典更高,代码也更简洁。
- 简化判断逻辑:原代码中
(rd[a]-1) or (cd[b]-1)的本质是判断该行/列的1数量是否大于1,直接写成row_counts[r] > 1 or col_counts[c] > 1更直观,无需额外的减法和布尔转换。 - 避免不必要的列表转换:
zip(rl, cl)生成的迭代器可直接遍历,不需要转成list,节省内存开销。 - 变量命名更直观:把
rd改为row_counts、cd改为col_counts,降低阅读成本。
优化后的代码
grid = [[0,0,0,0],[1,1,1,1],[0,0,0,1],[0,0,1,1],[0,0,0,1]] row_count = len(grid) col_count = len(grid[0]) if row_count > 0 else 0 # 用列表初始化行列计数,默认值为0 row_counts = [0] * row_count col_counts = [0] * col_count ones_coords = [] # 第一次遍历:统计行列的1数量,同时收集所有1的坐标 for row_idx, row in enumerate(grid): for col_idx, val in enumerate(row): if val == 1: row_counts[row_idx] += 1 col_counts[col_idx] += 1 ones_coords.append((row_idx, col_idx)) # 统计符合条件的1的数量 answer = sum(1 for (r, c) in ones_coords if row_counts[r] > 1 or col_counts[c] > 1)
超大网格场景的额外优化(可选)
如果处理的是极大网格,还可以省掉存储所有1坐标的内存,分两次遍历完成统计:
grid = [[0,0,0,0],[1,1,1,1],[0,0,0,1],[0,0,1,1],[0,0,0,1]] row_count = len(grid) col_count = len(grid[0]) if row_count > 0 else 0 row_counts = [0] * row_count col_counts = [0] * col_count # 第一次遍历:先统计所有行列的1数量 for row_idx, row in enumerate(grid): for col_idx, val in enumerate(row): if val == 1: row_counts[row_idx] += 1 col_counts[col_idx] += 1 # 第二次遍历:直接统计符合条件的1 answer = 0 for row_idx, row in enumerate(grid): for col_idx, val in enumerate(row): if val == 1 and (row_counts[row_idx] > 1 or col_counts[col_idx] > 1): answer += 1
内容的提问来源于stack exchange,提问作者bittahProfessional
相关产品推荐
相关产品推荐

