螺旋矩阵(数组)问题(网易考点)
>>>输入一个二维数组,要求顺时针打印数组内容
题目链接https://leetcode-cn.com/problems/spiral-matrix/
题目本身不难,但是逻辑必须想清楚,多次吃亏,这次一定要牢记
(以下代码是将结果存在一维数组中返回)
1 int num,sum=0; 2 vector<int> spiralOrder(vector<vector<int>>& ma) { 3 num=ma.size()*ma[0].size(); 4 int i,j,x=0,y=0; 5 int sizex=ma.size(),sizey=ma[0].size(); 6 vector<int> res; 7 while(sum<num){ 8 for(i=x,j=y;j<sizey-y;j++){//→→→ 9 res.push_back(ma[i][j]); 10 if((++sum)>=num) { 11 return res; 12 } 13 } 14 x=i+1;y=j-1; 15 for(i=x,j=y;i<sizex-x+1;i++){//↓↓↓ 16 res.push_back(ma[i][j]); 17 if((++sum)>=num) { 18 return res; 19 } 20 } 21 x=i-1;y=j-1; 22 for(i=x,j=y;j>=sizey-y-2;j--){//←←← 23 res.push_back(ma[i][j]); 24 if((++sum)>=num) { 25 return res; 26 } 27 } 28 x=i-1;y=j+1; 29 for(i=x,j=y;i>=sizex-x-1;i--){//↑↑↑ 30 res.push_back(ma[i][j]); 31 if((++sum)>=num) { 32 return res; 33 } 34 } 35 x=i+1;y=j+1; 36 } 37 return res; 38 }
1 //解法2: 2 从左至右,从上至下,从右至左,从下至上循环打印就好 3 class Printer { 4 public: 5 vector<int> clockwisePrint(vector<vector<int> > mat, int n, int m) //n m 为行列数 6 { 7 // write code here 8 vector<int> res; 9 int colbegin=0,colend=m-1,rowbegin=0,rowend=n-1; 10 int i=0,j=0; 11 while(colbegin<=colend && rowbegin<=rowend) 12 { 13 for(j=colbegin;j<=colend;j++)//right 14 res.push_back(mat[i][j]); 15 j--;rowbegin++; 16 if(res.size()>=n*m) return res; 17 for(i=rowbegin;i<=rowend;i++)//down 18 res.push_back(mat[i][j]); 19 i--;colend--; 20 if(res.size()>=n*m) return res; 21 for(j=colend;j>=colbegin;j--)//left 22 res.push_back(mat[i][j]); 23 j++;rowend--; 24 if(res.size()>=n*m) return res; 25 for(i=rowend;i>=rowbegin;i--) 26 res.push_back(mat[i][j]); 27 i++;colbegin++; 28 if(res.size()>=n*m) return res; 29 } 30 return res; 31 } 32 };