题目来源:
leetcode题目,网址:1030. 距离顺序排列矩阵单元格 - 力扣(LeetCode)
解题思路:
以目标单元格为中心向四周扩展,依次加入数组即可。
解题代码:
class Solution {
public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
int[][] res=new int[rows*cols][2];
boolean[][] visited=new boolean[rows][cols];
int[] r=new int[]{0,1,0,-1};
int[] c=new int[]{1,0,-1,0};
Queue<Integer> queue=new LinkedList<>();
queue.offer(0);
res[0][0]=rCenter;
res[0][1]=cCenter;
visited[rCenter][cCenter]=true;
for(int i=1;!queue.isEmpty() && i<rows*cols;){
int size=queue.size();
for(int j=0;j<size;j++){
int temp=queue.poll();
int rTemp=res[temp][0];
int cTemp=res[temp][1];
for(int k=0;k<4;k++){
if(rTemp+r[k]<rows && rTemp+r[k]>=0 && cTemp+c[k]<cols && cTemp+c[k]>=0 &&
!visited[rTemp+r[k]][cTemp+c[k]]){
res[i][0]=rTemp+r[k];
res[i][1]=cTemp+c[k];
visited[rTemp+r[k]][cTemp+c[k]]=true;
queue.offer(i);
i++;
}
}
}
}
return res;
}
}
总结:
方向向量,不久前刚在题解里面看到过。
官方题解给出了三种解法。第一种重写比较器,直接排序。第二种是桶排序,先计算出到目标点的距离,然后将相同距离的点放入同一个桶内,最后对桶进行排序。第三种是几何排序,与我的思路相似,但不同的是,他是直接往外移动,而我是使用队列保存。