因为可能出现行和列的数值不一样,所以采用上下左右的标识遍历,且实时更新,判断是否已遍历完了
class Solution { public: vector<int> spiralOrder(vector<vector<int>>& matrix) { vector<int>res; if(matrix.size()==0)return res; int left=0,right=matrix[0].size()-1; int up=0,down=matrix.size()-1; for(;left<=right&&up<=down;) { for(int j=left;j<=right;j++)res.push_back(matrix[up][j]); up++; //更新了up,需要判断是否超出,超出推出循环 if(up>down)break; for(int i=up;i<=down;i++)res.push_back(matrix[i][right]); right--; //更新了right,需要判断是否超出,超出推出循环 if(left>right)break; //如果上面竖,行,都存在,那边下面代码也肯定存在, for(int j=right;j>=left;j--)res.push_back(matrix[down][j]); down--; for(int i=down;i>=up;i--)res.push_back(matrix[i][left]); left++; } return res; } };
因为是行和列都是一样的,所以只用两个标识遍历,且不是实时更新,如果更新了后面无法遍历了
class Solution { public: vector<vector<int>> generateMatrix(int n) { //用一个行,和一个列标识就可以遍历了 int row=0,col=n-1; vector<vector<int>>res(n,vector<int>(n,-1)); int m=1; for(;row<=col;row++,col--) { for(int c=row;c<=col;c++)res[row][c]=m++; for(int s=row+1;s<=col;s++)res[s][col]=m++; for(int c=col-1;c>=row;c--)res[col][c]=m++; //s>=row+1 别忘记了 for(int s=col-1;s>=row+1;s--)res[s][row]=m++; } return res; } };