返回
聪慧破解1030题:矩阵单元格距离排序
闲谈
2023-09-20 15:10:45
- 距离顺序排列矩阵单元格
题目
给你一个大小为 m x n 的矩阵,矩阵中的元素为 0 和 1。请你按照 曼哈顿距离 从最小的到最大的顺序,返回矩阵中所有元素的坐标。
曼哈顿距离 是两个坐标之间的距离,计算方法是两个坐标对应每个维度的差的绝对值的和。
示例 1:
输入:matrix = [[0,0,0],[0,1,0],[0,0,0]]
输出:[[0,0],[0,1],[0,2],[1,1],[1,0],[1,2],[2,0],[2,1],[2,2]]
解释:坐标 (0,0) 到 (0,2) 的曼哈顿距离为 2。
坐标 (0,0) 到 (2,2) 的曼哈顿距离为 4。
坐标 (0,0) 到 (2,0) 的曼哈顿距离为 2。
由于 (0,0) 到 (2,2) 和 (0,0) 到 (2,0) 的曼哈顿距离相同,所以按字典序排列返回即可。
示例 2:
输入:matrix = [[0,0,0],[0,1,0],[1,1,1]]
输出:[[0,0],[0,1],[0,2],[1,0],[1,2],[1,1],[2,0],[2,1],[2,2]]
解释:坐标 (0,0) 到 (2,0) 的曼哈顿距离为 2。
坐标 (0,0) 到 (2,2) 的曼哈顿距离为 4。
坐标 (0,0) 到 (1,1) 的曼哈顿距离为 2。
由于 (0,0) 到 (2,0) 和 (0,0) 到 (1,1) 的曼哈顿距离相同,所以按字典序排列返回即可。
示例 3:
输入:matrix = [[0]]
输出:[[0,0]]
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 100
- matrix[i][j] 是 0 或 1
思路分析
- 转化为一维数组: 将矩阵转化为一维数组,每个元素为矩阵中每个单元格的坐标和距离。
- 排序: 根据距离对一维数组进行排序。
- 返回坐标: 返回一维数组中每个元素的坐标。
代码实现
def allCellsDistOrder(matrix):
"""
:type matrix: List[List[int]]
:rtype: List[List[int]]
"""
# 将矩阵转化为一维数组
cells = []
for i in range(len(matrix)):
for j in range(len(matrix[0])):
cells.append([i, j, abs(i - len(matrix) // 2) + abs(j - len(matrix[0]) // 2)])
# 根据距离对一维数组进行排序
cells.sort(key=lambda x: x[2])
# 返回一维数组中每个元素的坐标
return [[cell[0], cell[1]] for cell in cells]
复杂度分析
- 时间复杂度:O(mnlogmn),其中 m 和 n 是矩阵的行数和列数。
- 空间复杂度:O(mn),其中 m 和 n 是矩阵的行数和列数。
结语
这道题目是一道比较简单的贪心算法题目。通过将矩阵转化为一维数组,然后对一维数组进行排序,最后返回一维数组中每个元素的坐标,即可解决问题。