自己写的:
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为奇数的时候,最后一圈一定是只给一个位置赋值。
标签:count,59,螺旋,++,res,矩阵,--,int,vector From: https://www.cnblogs.com/hisun9/p/18516553