大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
1030. 距离顺序排列矩阵单元格
题目描述
给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。
另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。
返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)
示例 1:
输入:R = 1, C = 2, r0 = 0, c0 = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]
示例 2:
输入:R = 2, C = 2, r0 = 0, c0 = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。
示例 3:
输入:R = 2, C = 3, r0 = 1, c0 = 2
输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。
提示:
1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C
分析
排序
- 由于我们返回的答案是一个二维数组,且每个二维数组的第一个元素(即
res[i][0]
为横坐标,res[i][1]
为纵坐标,所以我们需要把结果数组定义成int[][] res = new int[R * C][2]
- 我们实现Java内置的Comparator并重写compare方法,按照两点距离差进行比较
- 直接排序,然后返回结果数组
res
就完成答案了
public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
int[][] res = new int[R * C][2];
for (int i = 0; i < res.length; i++) {
res[i][0] = i / C;
res[i][1] = i % C;
}
Arrays.sort(res, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return (Math.abs(o1[0]-r0)+Math.abs(o1[1]-c0)-(Math.abs(o2[0]-r0)+Math.abs(o2[1]-c0)));
}
});
return res;
}
BFS
也是一道挺经典的BFS模板题,区别就在于我们此时数组是int[R * C][2]
,所以数组的位置变化需要改变一下。详细的更改写在了注释上
class Solution {
public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
int[][] re = new int[R * C][2];
int dist = 0;
int cnt = 0; // 为坐标数,从0一直到R*C个
int[] factor = {-1, 1};
while (cnt < R * C) { // 只要cnt<R*C,就说明还有点未被遍历
for (int rowDist = 0; rowDist <= dist; rowDist++) { // 每层走的坐标数
int colDist = dist - rowDist;
// 开始找坐标
for (int i = 0; i < 2; i++) {
int row = r0 + factor[i] * rowDist;
for (int j = 0; j < 2; j++) {
int col = c0 + factor[j] * colDist;
// 如果坐标成立
if (row >= 0 && row < R && col >= 0 && col < C) {
re[cnt][0] = row;
re[cnt][1] = col;
cnt++;
}
if (colDist == 0) break;
}
if (rowDist == 0) break;
}
}
dist++; // 离题目给定点的距离加一
}
return re;
}
}
提交结果
2020年11月17日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn