59. 螺旋矩阵 II
对这次写的非常满意! 重点变量 offset,每一轮开始前确定好起点(starti,startj),确定offset即可在四个方向上填充数字!
这题是正方形,更简单
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int offset=n-1; //每走一轮,offset-2
int starti=0,startj=0,count=1;
int i=0,j=0;
while(offset>0)
{
//向右 offset步
for(j=startj;j<startj+offset;j++)
{
res[i][j]=count++;
}
//向下
for(i=starti;i<starti+offset;i++)
{
res[i][j]=count++;
}
//向左
for(;j>startj;j--)
{
res[i][j]=count++;
}
//向上
for(;i>starti;i--)
{
res[i][j]=count++;
}
starti++;startj++;
i=starti;j=startj;
offset-=2;
}
if(n%2==1) res[starti][startj]=count++;
return res;
}
};
剑指 Offer 29. 顺时针打印矩阵
这个是n×m的矩阵。。不同的是count的效用,如果res中元素数量超过count,就不要再循环下去了!!!一般在最后一轮生效。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int n=matrix.size();
if(n==0) return res;//注意如果输入[],下面那行会报错
int m=matrix[0].size();
int rowOffset=n-1,colOffset=m-1;
int count=0;//判断还有没有剩余一个没输出
int i=0,j=0,starti=0,startj=0;
while(rowOffset>0||colOffset>0)
{
for(j=startj;j<startj+colOffset&&count<m*n;j++)
{
res.push_back(matrix[i][j]);
count++;
}
for(i=starti;i<starti+rowOffset&&count<m*n;i++)
{
res.push_back(matrix[i][j]);count++;
}
for(;j>startj&&count<m*n;j--)
{
res.push_back(matrix[i][j]);count++;
}
for(;i>starti&&count<m*n;i--)
{
res.push_back(matrix[i][j]);count++;
}
colOffset-=2,rowOffset-=2;
starti++;startj++;
i=starti,j=startj;
}
if(count<m*n) res.push_back(matrix[starti][startj]);
return res;
}
};