59.螺旋矩阵

题目

自己写的:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        res[0][0] = 1;
        int k = 0;
        while (n - 2 * k > 0)
        {
            int i = k, j = k;
            if (k != 0)
                res[i][j] =res[i][ j - 1] + 1;
            for ( ++ j; j < n - k; ++ j) res[i][j] = res[i][j - 1] + 1;
            j -- ;
            for ( ++ i; i < n - k; ++ i) res[i][j] = res[i - 1][j] + 1;
            i -- ;
            for ( -- j; j >= k; -- j) res[i][j] = res[i][j + 1] + 1;
            j ++ ;
            for ( -- i; i > k; -- i) res[i][j] = res[i + 1][j] + 1;
            k ++ ;
        }
        return res;
    }
};

自己写的时候感觉条理并没有那么清晰,主要还是没搞清楚循环不变量原则,这里我写的代码的循环不变量可能就是对每个圈的处理不变,然后每次手动指定要循环的这个圈的起点。

看了卡哥的视频,条理清晰多了,再反思自己的:

自己似乎对每条边是左开右闭处理,然后在第四条边(即向上走的那条边)的处理过程中就又不满足了左开右闭处理(因为最上面的那个点(即每个圈的起点)我已经手动指定了值),所以这就有一个矛盾点在了。

然后卡哥采取的是左闭右开处理,这样就完美让每条边得到相同的处理,而且不用对最上面的那个点进行手动处理。

不过看了卡哥的代码,我觉得还能对自己写的代码优化下,即引入一个变量count,用它来对vector赋值:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, 0));
        int count = 1;
        int k = 0;
        while (n - 2 * k > 0)
        {
            int i = k, j = k;
            for (; j < n - k; ++ j) res[i][j] = count ++ ;
            j -- ;
            for ( ++ i; i < n - k; ++ i) res[i][j] = count ++ ;
            i -- ;
            for ( -- j; j >= k; -- j) res[i][j] = count ++ ;
            j ++ ;
            for ( -- i; i > k; -- i) res[i][j] = count ++ ;
            k ++ ;
        }
        return res;
    }
};

其实还有优化的地方,比如若n为奇数的时候,不用再进入while循环,而是直接在while循坏外就给它处理掉了,因为当n为奇数的时候,最后一圈一定是只给一个位置赋值。

posted @ 2024-10-30 20:34  hisun9  阅读(19)  评论(0)    收藏  举报