【力扣hot100题】(018)螺旋矩阵
题目不难,但做的过程很痛苦。
老是频频出错,一开始用的递归,遍历完的行/列就在原矩阵中去掉,不知道为什么老是在最后一个元素出错,反反复复改了很多遍,后来发现应该是去掉每一行的最后一个元素时行数不为零导致又会递归几遍,然后原来删除的数还在内存中又被遍历了,导致某些元素被遍历多次。
class Solution {
public:
int direction=0;
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size()==0||matrix[0].size()==0) return {};
int n=matrix.size();
int m=matrix[0].size();
vector<int> result;
if(direction==0){
for(int i=0;i<m;i++){
result.push_back(matrix[0][i]);
}
matrix.erase(matrix.begin());
}
else if(direction==1){
for(int i=0;i<n;i++){
result.push_back(matrix[i][m-1]);
matrix[i].pop_back();
}
}
else if(direction==2){
for(int i=m-1;i>=0;i--){
result.push_back(matrix[n-1][i]);
}
matrix.pop_back();
}
else{
for(int i=n-1;i>=0;i--){
result.push_back(matrix[i][0]);
matrix[i].erase(matrix[i].begin());
}
}
direction=(direction+1)%4;
vector<int> dg=spiralOrder(matrix);
result.insert(result.end(),dg.begin(),dg.end());
return result;
}
};
递归很消耗空间,下面用循环再实现一遍:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> result;
int direction=0;
while(1){
if(matrix.size()==0||matrix[0].size()==0) break;
if(direction==0){
for(int i=0;i<matrix[0].size();i++){
result.push_back(matrix[0][i]);
}
matrix.erase(matrix.begin());
}
else if(direction==1){
for(int i=0;i<matrix.size();i++){
result.push_back(matrix[i][matrix[i].size()-1]);
matrix[i].pop_back();
}
}
else if(direction==2){
for(int i=matrix[0].size()-1;i>=0;i--){
result.push_back(matrix[matrix.size()-1][i]);
}
matrix.pop_back();
}
else if(direction==3){
for(int i=matrix.size()-1;i>=0;i--){
result.push_back(matrix[i][0]);
matrix[i].erase(matrix[i].begin());
}
}
direction=(direction+1)%4;
}
return result;
}
};