Leetcode 1030 Matrix Cells in Distance Order

为了保持(短期)的日更(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;
    }
    
};

有点草率,还有好几道题没整理,明天再说吧🤷‍♀️。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容