两个题的解题思路完全相同,设立 上下左右 四个边界;然后沿着边界依次向右、向下、向左、向右移动,四次移动唯一次循环,每次移动后更新边界,例如,向右移动时,移动完 上边界+1(即去掉第一行),其他同理,然后判断是否与下边界相交(这里不包含相等,找个例子试试会发现出错),若相交说明完成遍历,跳出循环。
遇到的问题:
初次使用vector二维数组不熟练导致的问题:vector<vector<int> > matrix(n,vector<int>(n,0));要初始化空间,否则后面直接用matrix[on][i]会报错;右和下边界要-1,否则越界。这两个都会有这种reference binding to null pointer of type 'std::vector<int, std::allocator<int>>' (stl_vector.h)报错,查阅后发现是越界和没有预留空间;没有判读数组是否为空也会报错,但是没有遇到,以后遇到注意。
嗯还有一个push_back有下划线。
螺旋矩阵(54)
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int on=0;
int left=0;
int under=matrix.size()-1;
int right=matrix[0].size()-1;
vector<int> v;
while(1)
{
for(int i=left;i<=right;i++)
v.push_back(matrix[on][i]);
if(++on>under)
break;
for(int i=on;i<=under;i++)
v.push_back(matrix[i][right]);
if(--right<left)
break;
for(int i=right;i>=left;i--)
v.push_back(matrix[under][i]);
if(--under<on)
break;
for(int i=under;i>=on;i--)
v.push_back(matrix[i][left]);
if(++left>right)
break;
}
return v;
}
};
2.螺旋矩阵II(59)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
int on=0;
int left=0;
int under=n-1;
int right=n-1;
vector<vector<int> > matrix(n,vector<int>(n,0));
int m=1;
while(1)
{
for(int i=left;i<=right;i++)
{
matrix[on][i]=m;
m++;
}
if(++on>under)
break;
for(int i=on;i<=under;i++)
{
matrix[i][right]=m;
m++;
}
if(--right<left)
break;
for(int i=right;i>=left;i--)
{
matrix[under][i]=m;
m++;
}
if(--under<on)
break;
for(int i=under;i>=on;i--)
{
matrix[i][left]=m;
m++;
}
if(++left>right)
break;
}
return matrix;
}
};