![](https://i-blog.csdnimg.cn/blog_migrate/3b298ccb542e8b80f269e85f4e066b2d.png)
这道题就是找规律,模拟顺时针画矩阵的过程。
每一条边都要坚持一致的原则,才能按照统一的规则画下来,我的做法是假设左开右闭。如下图。
![](https://i-blog.csdnimg.cn/blog_migrate/a775bcfb64b95bed3a3041f49c755922.jpeg)
以下是找规律的过程
![](https://i-blog.csdnimg.cn/blog_migrate/7e9c3a7fa7e0665380712427f153c2ff.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/71e2f8a84cc033ba8a347d22b76c48e3.jpeg)
通过找规律也可以知道,奇偶需要分开处理,n为奇数时中间会有一个单独的小方块。
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); //使用vector定义二维数组
int x = 0, y = n - 1; //边界
int tmp = 1; //填充数字
int i;
if(n % 2 == 0){ //n为偶数
while(x < n / 2){
//模拟转了一圈
//模拟填充上行从左到右(左闭右开)
for(i = x; i < y; i++){
res[x][i] = tmp;
tmp++;
}
//模拟填充右列从上到下(左闭右开)
for(i = x; i < y; i++){
res[i][y] = tmp;
tmp++;
}
//模拟填充下行从右到左(左闭右开)
for(i = y; i > x; i--){
res[y][i] = tmp;
tmp++;
}
//模拟填充左列从下到上(左闭右开)
for(i = y; i > x; i--){
res[i][x] = tmp;
tmp++;
}
//下一圈的边界
x++;
y--;
}
}else{ //n为奇数
while(x < n / 2){
for(i = x; i < y; i++){
res[x][i] = tmp;
tmp++;
}
for(i = x; i < y; i++){
res[i][y] = tmp;
tmp++;
}
for(i = y; i > x; i--){
res[y][i] = tmp;
tmp++;
}
for(i = y; i > x; i--){
res[i][x] = tmp;
tmp++;
}
x++;
y--;
}
res[x][y] = tmp; //n为奇数时单独填充中心位置
}
return res;
}
};
通过观察知,奇偶只有中心位置不一样,该代码重复量过大,只需对中心位置单独处理即可。
改进后代码:
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); //使用vector定义二维数组
int x = 0, y = n - 1; //边界
int tmp = 1; //填充数字
int i;
while(x < n / 2){
//模拟转了一圈
//模拟填充上行从左到右(左闭右开)
for(i = x; i < y; i++){
res[x][i] = tmp;
tmp++;
}
//模拟填充右列从上到下(左闭右开)
for(i = x; i < y; i++){
res[i][y] = tmp;
tmp++;
}
//模拟填充下行从右到左(左闭右开)
for(i = y; i > x; i--){
res[y][i] = tmp;
tmp++;
}
//模拟填充左列从下到上(左闭右开)
for(i = y; i > x; i--){
res[i][x] = tmp;
tmp++;
}
//下一圈的边界
x++;
y--;
}
if(n % 2 != 0) res[x][y] = tmp; //n为奇数时单独填充中心位置
return res;
}
};
通过本题学习到的小语法点:
- 使用vector定义二维数组
vector<vector> result(n, vector(n, 0));
更新:
之后反手去写了54.螺旋矩阵,发现自己的写法不具有普适性。设定四个边界,更容易理解。一味地找规律代码可读性不高。之前傻傻地找规律就当是记录一下自己yuchun的思考过程叭(捂脸
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> result(n, vector<int>(n, 0));
//上下左右四个边界
int up = 0, down = n - 1, left = 0, right = n - 1;
int tmp = 1; // 填充数字
int i;
while(up < down && left < right){ //while(up < n / 2)也可以
for(i = left; i < right; i++){
result[up][i] = tmp++;
}
for(i = up; i < down; i++){
result[i][right] = tmp++;
}
for(i = right; i > left; i--){
result[down][i] = tmp++;
}
for(i = down; i > up; i--){
result[i][left] = tmp++;
}
up++;
down--;
left++;
right--;
}
if(right == left) result[up][left] = tmp;
return result;
}
};