1030. 距离顺序排列矩阵单元格 - 力扣(LeetCode)
可以使用 BFS(广度优先搜索)或排序的方法来解决这个问题。以下是使用排序的方法:
解题思路:
-
生成矩阵中所有单元格的坐标。
-
计算每个单元格到
(rCenter, cCenter)
的曼哈顿距离。 -
按照曼哈顿距离排序,最后返回排序后的结果。
代码实现:
def allCellsDistOrder(rows, cols, rCenter, cCenter):
# 生成所有坐标
cells = [(r, c) for r in range(rows) for c in range(cols)]
# 按曼哈顿距离排序
cells.sort(key=lambda cell: abs(cell[0] - rCenter) + abs(cell[1] - cCenter))
return cells
# 测试
rows, cols, rCenter, cCenter = 3, 3, 0, 0
print(allCellsDistOrder(rows, cols, rCenter, cCenter))
复杂度分析:
-
生成所有单元格的坐标:
O(rows * cols)
-
计算曼哈顿距离并排序:
O(rows * cols log(rows * cols))
-
总体复杂度为
O(rows * cols log(rows * cols))
,适用于较小矩阵。
如果 rows
和 cols
很大,可以使用 BFS 来避免排序,提高效率至 O(rows * cols)
。你需要一个队列和 visited
集合来逐层扩展单元格。要实现 BFS 版本吗?