算法打卡日志-2020.11.17 | LeetCode1030
这道题的标签是排序,实际难度简单,思路也很清晰,就是根据曼哈顿距离来排序,但是在coding时有小坑。
首先排序算法不算很熟悉,所以在使用插入排序时有些小失误。然后是一个Java二维数组上的坑,昨天也在这上面踩坑了,但是没有记录,今天既然再次踩坑了,就复盘一下。
int[][] arr=new int[10][]
和int[][] arr=new int[10][2]
初始化产生的结果时不一样的,前者产生的是10个null
而后者初始化了10个[0,0]。- 对二维数组的赋值要小心引用传递。在地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);
}