一:题目
二:思路
1.我们需要模拟数字的变化过程,
2.模拟填充的过程:(顺时针)
填充上行 从左到右
填充右行 从上到下
填充下行 从右向左
填充左行 从下到上
3.分析我们填充数字的过程,比如n=3的时候
上行:1,2
右行:3,4
下行:5,6
左行:7,8
这么分析下来我们每次填充的规律也就是 左开右闭
三:上码
class Solution {
public:/***思路:1.我们需要模拟数字的变化过程,2.模拟填充的过程:(顺时针)填充上行 从左到右填充右行 从上到下填充下行 从右向左填充左行 从下到上3.分析我们填充数字的过程,比如n=3的时候上行:1,2右行:3,4下行:5,6左行:7,8这么分析下来我们每次填充的规律也就是 左开右闭 **/vector<vector<int>> generateMatrix(int n) {vector<vector<int> >ans(n,vector<int>(n,0));//用vector定义一个二维数组int loop = n/2;//这个求出模拟几圈,比如 n = 3 那就模拟一圈,n= 4那就需要模拟两圈int mid = n/2;//当n=3为奇数的时候,我们可以知道最中间的一个值下标(1,1)int border = 1;//这个是为了控制我们每次遍历的时候长度int count = 1;//第一值的大小int startx = 0,starty = 0;//记录每一圈的开始位置int i,j;while(loop--){i = startx;j = starty;//四个for循环模拟转一圈//模拟上行从左到右(左开右闭)for(j = starty; j < starty+n-border; j++){//starty+n-border:这里 可以拿n=4时来理解ans[startx][j] = count++;//这里是行不变 列变}//模拟右行 从上到下(左开右闭)for(i = startx; i < startx+n-border; i++){ans[i][j] = count++;//这里是行变 列不变 列为第一个for循环中的j}//模拟下行 从右向左(左开右闭)(这里的左开右闭是相对于for循环来说的)for(;j > starty; j--) {ans[i][j] = count++;//这里行不变 列在变(行取的是第二个for循环的i}//模拟左行 从下到上(左开右闭)for(;i > startx; i--){ans[i][j] = count++;//这里是行在变 列不变 (列取的是第三个for循环中的i)}startx++;//如果有两圈的话那么起始位置就变了,拿n=4举例,第一圈起始位置(0,0),第二圈的起始位置为(1,1)starty++;border+=2;//当到第二圈的时候,我们的边界为3,也就是一行的第一个位置不可取,倒数第一个倒数第二个位置不可取}if(n%2 != 0){ans[mid][mid] = count;} return ans;}
};
渣渣杰又水了一道 这个模拟的过程有意思 对数组玩的真溜