1、注意区间:我写的是每一次都留最后一个元素下次处理。左闭右开。
2、每次先遍历完一圈再遍历下一圈。用sx来记录 每一圈要走多少步。用 turn来记录这次应该往哪走了。
比如n=4 turn=0,sx=2时,那么最外面一圈要走两步(两步要包括在开始不用走的那个位置也就是 1 2 3写好了)
之后turn=1,再竖着写....
之后一圈完了的时候(如果此时sx>=0 就进行下一圈),此时i多减了1,此时应该 i+1,j+1(这样才是下一圈开始的位置),还要注意sx-=2;因为一圈之后两边界都缩小了1。此时turn又从0开始
继续转圈。直到sx<0,结束。并且要判断如果是奇数的话,最中心的数要加上。
class Solution { public: vector<vector<int>> generateMatrix(int n) { vector<vector<int>>vec(n); int a[21][21]; memset(a,0,sizeof(a)); int i,j,k; int sx=n-2; //走几步 int x=0; int turn=0; int sum=1; i=j=0; if(n==1) { vec[0].push_back(1); return vec; } while(1){ if(turn==0){ //往右走 for(k=0;k<=sx;k++) a[i][j++]=sum++; if(sum>n*n) break; turn=1; } if(turn==1){ for(k=0;k<=sx;k++){ a[i++][j]=sum++; } turn =2; } if(turn==2){ for(k=0;k<=sx;k++){ a[i][j--]=sum++; } turn=3; } if(turn==3){ for(k=0;k<=sx;k++){ a[i--][j]=sum++; } turn=0; } sx-=2; if(sx<0) break; i+=1; j+=1; } if(sx<0) { if(n%2) a[i+1][j+1]=sum; } int t=0,p=0; for(i=0;i<=n-1;i++){ for(j=0;j<=n-1;j++) { vec[i].push_back(a[i][j]); cout<<a[i][j]<<" "; } cout<<endl; } return vec; } };
标签:sx,59,21,int,一圈,矩阵,力扣,turn,vec From: https://www.cnblogs.com/bhd123/p/17222236.html