判断二维数组是否为空时,要先用
if( matrix.size()==0||matrix[0].size()==0) 进行判断,而不能先定义一个len1、len2
int len1 = matrix.size();
int len2 = matrix[0].size();
然后再if(len1==0||len2==0) 这样的话如果matrix.size()==0后,根本无法访问matrix[0] ,在计算len2时会造成读取内存错误
题目:
答案:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int>res;
//首先检测其是否为空才能计算下面的len 因为如果不这样的话会导致当len1=0时,
//访问不到matrix[0],因为其指向空指针,会造成内存地址访问错误
if( matrix.size()==0||matrix[0].size()==0)
{
return {};
}
int len1 = matrix.size();
int len2 = matrix[0].size();
//定义边界
int left=0;
int right = len2-1;
int top=0,bottom = len1-1;
while(true)
{
//遍历top行
for(int i=left;i<=right;i++)
{
res.push_back(matrix[top][i]);
}
//top下移 并检测边界
top++;
if(top>bottom) break;
//遍历right列
for(int j=top;j<=bottom;j++)
{
res.push_back(matrix[j][right]);
}
//right左移 并检测边界
right--;
if(right<left) break;
//遍历bottom行
for(int i=right;i>=left;i--)
{
res.push_back(matrix[bottom][i]);
}
//bottom上移并检测边界
bottom--;
if(bottom<top) break;
//遍历left列
for(int j=bottom;j>=top;j--)
{
res.push_back(matrix[j][left]);
}
//left列右移
left++;
if(left>right) break;
}
return res;
}
};