[LeetCode No.1030] 距离顺序排列矩阵单元格
题目
题解
题解一:
最容易的方法就是直接用二维数组存储矩阵的点,然后使用自定义的Arrays.sort()方法进行排序(int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。)
package No1030;
import java.util.*;
class Solution {
public static int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
int [][]answer = new int[R*C][];
for(int i=0;i<R;i++){
for(int j=0;j<C;j++){
answer[i*C+j] = new int[]{i,j};
}
}
Arrays.sort(answer,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 answer;
}
public static void main(String[] args){
int [][] answer = allCellsDistOrder(1, 2, 0, 0);
for(int i[]:answer){
System.out.print(i[1]);
}
}
}
题解二:
实际在枚举所有点时,我们可以直接按照哈曼顿距离分桶。这样我们就可以实现线性的桶排序。
关于桶排序https://blog.csdn.net/qq_27124771/article/details/87651495
package No1030;
import java.math.*;
import java.util.*;
public class Solution2 {
public int[][] allCellsDistOrder(int R, int C, int r0, int c0) {
int Bucket_num = Math.max(r0, R-1-r0)+Math.max(c0, C-1-c0);
List<List<int[]>> bucket = new ArrayList<List<int []>>();
for(int i = 0; i <=Bucket_num; i++){
bucket.add(new ArrayList<int []>());
}
for(int i = 0; i < R; i++){
for(int j = 0; j < C; j++){
int dist = Dist(i,j,r0,c0);
bucket.get(dist).add(new int[]{i,j});
}
}
int[][] answer = new int [R*C][];
int index = 0;
for(int i = 0; i<Bucket_num; i++){
List<int[]> temp = bucket.get(i);
for(int [] a:temp){
answer[index++] = a;
}
}
return answer;
}
public int Dist(int r,int c,int r0,int c0){
return Math.abs(r-r0)+Math.abs(c-c0);
}
public static void main(String[] args){
}
}