排序:1030、距离顺序排列矩阵单元格

思路:暴力法求取所有距离,然后根据距离排序;利用桶排序的思想,将相同距离的点放在一起,然后遍历一次返回结果。

暴力法:

class Solution {
public:
    vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
        vector<vector<int>>res;
        for(int i=0;i<R;i++){
            for(int j=0;j<C;j++){
                res.push_back({i,j});
            }
        }
        //自定义排序,res按照到(r0,c0)点的距离从小到大排序,[=]表示结果为vector
        sort(res.begin(),res.end(),[=](vector<int>a,vector<int>b){
            return abs(a[0]-r0)+abs(a[1]-c0)<abs(b[0]-r0)+abs(b[1]-c0);
        });
        return res;
    }
};

桶排序:

class Solution {
public:
    //计算距离
    int cal_distance(int a,int b,int r0,int c0){
        return abs(a-r0)+abs(b-c0);
    }
    vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
        //求出最大距离,从而确定桶的大小
        int maxDistance=max(r0,abs(R-1-r0))+max(c0,abs(C-1-c0));
        vector<vector<vector<int>>>bucket(maxDistance+1);
        for(int i=0;i<R;i++){
            for(int j=0;j<C;j++){
                int distance=cal_distance(i,j,r0,c0);
                vector<int>temp={i,j};
                //move可以省略,move会无条件将自己的参数转换为右值。在对象拷贝的时候,在运行时,它们不会产生一行代码,可以减少资源创建和释放
                bucket[distance].push_back(move(temp));
            }
        }
        vector<vector<int>>res;
        //遍历桶,获得结果
        for(int i=0;i<=maxDistance;i++){
            for(auto it:bucket[i])
                res.push_back(it);
        }
        return res;
    }
};

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值