【力扣】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];

 

 

力扣第31题“下一个排列”的题目要求是实现获取下一个排列的函数,将给定数字序列重新排列成字典序中下一个更大的排列。若不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列),且必须原地修改,只允许使用额外常数空间[^1][^2][^4]。 ### 解题思路 要找到一个更大的排列,需从后往前找,找到那个突然变小的值,然后用后面比它稍微大一点的值去替换它,再把它原来位置之后的所有值反序。具体步骤如下: 1. 从末尾寻找第一个破坏降序的数。 2. 在该数之后的序列中寻找第一个大于它的数,交换这两个数。 3. 将交换位置之后的序列按升序排列(可通过反序实现)。 若整个数组是降序排列的,则不存在下一个更大的排列,需将数组重置为最小的排列(即升序排序)[^3][^5]。 ### 代码实现 以下是使用C++实现的代码: ```cpp #include <iostream> #include <vector> #include <algorithm> class Solution { public: void nextPermutation(std::vector<int>& nums) { // 获得最大长序 int pos = nums.size() - 1; // 1. 从末尾寻找第一个破坏降序的数 while(pos > 0 && nums[pos] <= nums[pos-1]) pos--; // 2. 找到第一个比它大的数,交换 if(pos > 0){ for(int i = nums.size()-1 ; i>=pos ; i--){ if(nums[i] > nums[pos-1]){ std::swap(nums[pos-1], nums[i]); break; } } } // 3. 升序排列 std::reverse(nums.begin() + pos, nums.end()); } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

aigo-2021

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

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

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

打赏作者

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

抵扣说明:

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

余额充值