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