每日一题.1030. 距离顺序排列矩阵单元格

给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)

我的解法:首先,将矩阵中单元格到(r0, c0)的距离依次存放到数组sort中,sort是一个二维数组,sort[i][0]存放距离,sort[i][1]存放单元格在矩阵中的位置;然后,依据sort[i][0]对sort进行升序排序;最后,依据sort[i][1]的顺序,将单元格坐标依次添加到res集合中。

时间复杂度:O(n2),空间复杂度:O(n)

class Solution {
    public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
        /*sort[i][0]存放距离, sort[i][1]存放原始下标*/
        int[][] sort = new int[R*C][2];
        /*计算R*C矩阵中每个单元格到(r0,c0)的距离*/
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                sort[C*i+j][0] = Math.abs(i - r0) + Math.abs(j - c0);
                sort[C*i+j][1] = C * i + j;
            }
        }
        /*将sort数组按照距离排序*/
        Arrays.sort(sort, Comparator.comparingInt(o -> o[0]));
        /*存储按曼哈顿距离升序排序的节点坐标*/
        int[][] res = new int[R*C][2];
        /*遍历sort, 将sort[i][1]对应的节点的坐标存放到res中*/
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                int loca = sort[C * i + j][1];
                int x = loca / C, y = loca % C;
                res[C*i+j][0] = x;
                res[C*i+j][1] = y;
            }
        }
        return res;
    }
}

你可能感兴趣的:(每日一题.1030. 距离顺序排列矩阵单元格)