算法打卡日志-2020.11.17 | LeetCode1030

题目 1030. 距离顺序排列矩阵单元格

这道题的标签是排序,实际难度简单,思路也很清晰,就是根据曼哈顿距离来排序,但是在coding时有小坑。

首先排序算法不算很熟悉,所以在使用插入排序时有些小失误。然后是一个Java二维数组上的坑,昨天也在这上面踩坑了,但是没有记录,今天既然再次踩坑了,就复盘一下。

  1. int[][] arr=new int[10][]int[][] arr=new int[10][2]初始化产生的结果时不一样的,前者产生的是10个null 而后者初始化了10个[0,0]。
  2. 对二维数组的赋值要小心引用传递。在地18、19两句代码一定要依次赋值,不能直接res[i+1]=res[i]赋值,不然就是引用赋值过去,数据会同步变化,之前一直没在意,被这个小坑坑了好久,花了好多时间才明白这是个坑。
public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
    int[][] res = new int[R * C][2];
    int count = 0;//记录已排序的数据个数,插入排序的切入点
    //两层循环遍历矩阵
    for (int r = 0; r < R; r++) {
        for (int c = 0; c < C; c++) {
            count++;
            if (c == 0 && r == 0) {
                continue;
            }
            int i = count - 2;
            for (; i >= 0; i--) {
                int dis1 = dis(res[i][0], res[i][1], r0, c0);
                int dis2 = dis(r, c, r0, c0);
                if (dis1 <= dis2) {
                    break;
                } else {
                    res[i + 1][0] = res[i][0];//Mark
                    res[i + 1][1] = res[i][1];//Mark
                }
            }
            res[i + 1][0] = r;
            res[i + 1][1] = c;

        }
    }

    return res;
}

private int dis(int r, int c, int r0, int c0) {
    return Math.abs(r - r0) + Math.abs(c - c0);
}
posted @ 2020-11-17 20:35  PPPPu  阅读(71)  评论(0)    收藏  举报