Leetcode59
1.问题描述
2.解决方案
1.整体思路呢,看图和注释就明白了,就是一圈一圈的填充,其中每一圈都分四条边填充
2.重要的是这个循环不变量原则,这个通俗解释就是你需要使用你所定义的变量取描述你所在的圈和边,也就是第n圈,第k条边等等,都是使用一组变量去表示的,而不能加入用数字模拟出的一些值来描述圈和边
3.这样就不具备下一圈下一条边还适用的特点,这个是有点难以理解的,多理解!!!
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n,vector<int>(n,-1));
int loop=n/2; //矩阵总共有几圈,例如n为奇数3,那么loop=1,只是循环一圈,矩阵中间的值需要单独处理
int startX=0,startY=0; //每一圈开始的点(startX,startY)
int lineLength=n-1; //每一圈有四条边组成,第一圈边的长度为n-1
int val=1; //要给矩阵赋的值1,2,3...
while((loop--)>0){
//(i,j)==(startX,startY)
int i=startX,j=startY;
//每一条边的遍历赋值都要用到上一条边结束后的(i,j),这样更方便赋值
//1.上边(长度n-1)(左闭右闭)--Y在变化--结束循环(i,j)在右上角了
for(j=startY;j<=startY+lineLength-1;j++){
ans[startX][j]=val++;
}
//2.右边(长度n-1)(左闭右闭)--X在变化--结束循环(i,j)在右下角了
for(i=startX;i<=startX+lineLength-1;i++){
ans[i][j]=val++;
}
//3.下边(长度n-1)(左闭右闭)--Y在变化--结束循环(i,j)在左下角了
for(;j>=startY+1;j--){
ans[i][j]=val++;
}
//4.左边(长度n-1)(左闭右闭)--X在变化--结束循环(i,j)在左上角了
for(;i>=startX+1;i--){
ans[i][j]=val++;
}
//循环结束,要想着while外面定义的五个全局变量,都看一遍看看哪个需要变,这样才不会漏掉某一个
//1.第二圈开始的时候,起始位置要各自加1,例如:第一圈起始位置是(0, 0),第二圈起始位置是(1, 1)
//2.下一圈一条边长度减2
startX++; startY++;
lineLength-=2;
}
//如果n为奇数的话,需要单独给矩阵最中间的位置赋值
//矩阵中间的位置,例如:n为3, 中间的位置就是n/2=(1,1),n为5,中间位置为n/2=(2, 2)
if(n%2!=0) ans[n/2][n/2]=val;
//结束
return ans;
}
};