【力扣】1030.距离顺序排列矩阵单元格

给定四个整数 row ,   cols ,  rCenter 和 cCenter 。有一个 rows x cols 的矩阵,你在单元格上的坐标是 (rCenter, cCenter) 。

返回矩阵中的所有单元格的坐标,并按与 (rCenter, cCenter) 的 距离 从最小到最大的顺序排。你可以按 任何 满足此条件的顺序返回答案。

单元格(r1, c1) 和 (r2, c2) 之间的距离为|r1 - r2| + |c1 - c2|

示例 1:

输入:rows = 1, cols = 2, rCenter = 0, cCenter = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]

示例 2:

输入:rows = 2, cols = 2, rCenter = 0, cCenter = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。

示例 3:

输入:rows = 2, cols = 3, rCenter = 1, cCenter = 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 <= rows, cols <= 100
0 <= rCenter < rows
0 <= cCenter < cols (该点一定是在矩阵单元格范围之内的)

class Solution {
    public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
        int[][] arr=new int[rows*cols][2];//定义存储返回结果的二维数组
        int index=0;//二维数组中一维数组的下标
        for(int i=0;i<rows;i++){
            for(int j=0;j<cols;j++){
                arr[index++]=new int[]{i,j};//遍历得到所有的坐标
            }
        }
        //排序
        Arrays.sort(arr,new Comparator<int[]>(){  //比较器
            @Override
            public int compare(int[] r0,int[] r1){ //一维数组
                int l1=Math.abs(r0[0]-rCenter)+Math.abs(r0[1]-cCenter);
                int l2=Math.abs(r1[0]-rCenter)+Math.abs(r1[1]-cCenter);
                return l1-l2;
            }
        });
        return arr;
    }
}

 

题解:

①定义二维数组arr:二维数组中一维数组的个数是rows*cols,一维数组长度是2;

②通过双重for循环将所有坐标存到二维数组arr中;

③排序:使用Arrays.sort(T[ ] a, Comparator>? super T<> c)进行排序

当调用此方法来进行自定义数组排序时,需要我们指定外部比较器。第二个参数就是自定义的比较器类,这个类必须继承Comparator接口并实现compare方法,于是就对T[]按照自定义的比较器规则进行排序。

此排序被保证是稳定的:相等的元素不会被重新排序的排序结果。

以输入:rows = 2, cols = 2, rCenter = 0, cCenter = 1
输出:[[0,1],[0,0],[1,1],[1,0]]为例

将所有的坐标,两两进行比较,每个都用距离公式|r1 - r2| + |c1 - c2|与目标坐标(rCenter, cCenter)进行计算,最后将两组得到的距离做差,将该比较器结果返回,作为arr排序的依据。

即:所有的组合

两两比较[0,1],[0,0][1,0],[0,1][1,0],[0,0][1,1],[0,0][1,1],[1,0]
l1-l2(距离做差)-1210-1

Array.sort()对二维数组进行排序
二维数组每一行有两个元素,如何对二维数组利用第i列的元素进行排列?

例如,对第0列的元素进行升序排列:

int[][] temp=new int[][]{{3,6},{2,4},{1,5},{4,9}};
        Arrays.sort(temp, new Comparator<int[]>(){

            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]-o2[0];
            }

        });
        for(int i=0;i<temp.length;i++){
            System.out.println(Arrays.toString(temp[i]));    
        }

输出:
[1, 5]
[2, 4]
[3, 6]
[4, 9]
如果对第1列元素升序排列只需要return o1[1]-o2[1];

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

aigo-2021

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值