为了保持(短期)的日更(bushi) ,我又来了,就不抄题了,题目链接如下:
链接:https://leetcode-cn.com/problems/matrix-cells-in-distance-order
我实现了两种方法
1 直接排序
需要用到lambda表达式
class Solution {
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> ans;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
ans.push_back({i, j});
}
}
sort(ans.begin(), ans.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 ans;
}
};
2. 几何方法
围着(r0,c0)的每一圈正方形边上的点显然是相同的距离,因此根据距离顺序遍历就能得到最后的排序啦
class Solution {
public:
int distance(int i, int j, int & r0, int & c0){
return abs(i-r0)+abs(j-c0);
}
bool check(int i, int j, int& R, int& C){
return i>=0&&j>=0&&i<R&&j<C;
}
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> ans;
int d = max(max(distance(0,0,r0,c0), distance(0,C-1,r0,c0)),
max(distance(R-1,0,r0,c0), distance(R-1,C-1,r0,c0)));
ans.push_back(vector<int>({r0,c0}));
for(int s=1;s<=d;s++){
for(int i=0;i<=s;i++){
int j=s-i;
if(check(r0-i,c0-j,R,C))ans.push_back(vector<int>({r0-i,c0-j}));
if(j&&check(r0-i,c0+j,R,C))ans.push_back(vector<int>({r0-i,c0+j}));
if(i){
if(check(r0+i,c0-j,R,C))ans.push_back(vector<int>({r0+i,c0-j}));
if(j&&check(r0+i,c0+j,R,C))ans.push_back(vector<int>({r0+i,c0+j}));
}
}
}
return ans;
}
};
有点草率,还有好几道题没整理,明天再说吧🤷♀️。