返回

聪慧破解1030题:矩阵单元格距离排序

闲谈

  1. 距离顺序排列矩阵单元格

题目

给你一个大小为 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

思路分析

  1. 转化为一维数组: 将矩阵转化为一维数组,每个元素为矩阵中每个单元格的坐标和距离。
  2. 排序: 根据距离对一维数组进行排序。
  3. 返回坐标: 返回一维数组中每个元素的坐标。

代码实现

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 是矩阵的行数和列数。

结语

这道题目是一道比较简单的贪心算法题目。通过将矩阵转化为一维数组,然后对一维数组进行排序,最后返回一维数组中每个元素的坐标,即可解决问题。