模拟题目,使用额外的空间来记录是否遍历过,时间复杂度O(n^2)
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
int x = 0, y = 0, i = 0, n = matrix.size();
if(n==0) return res;
int m = matrix[0].size();
vector<vector<bool>> isVisited(n,vector<bool>(m,false));
isVisited[0][0]=true;
res.push_back(matrix[x][y]);
for(int j=1;j<n*m;j++){
//cout<<j<<endl;
int a = x + dx[i];
int b = y + dy[i];
//cout<<j<<" "<<a<<endl;
if(a>=m||a<0||b>=n||b<0||isVisited[b][a]){
i=(i+1)%4;
a = x + dx[i];
b = y + dy[i];
}
x = a;
y = b;
isVisited[b][a] = true;
res.push_back(matrix[b][a]);
}
return res;
}
};
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
const int dx[]={1,0,-1,0};
const int dy[]={0,1,0,-1};
int x = 0, y = 0, i = 0;
if(n==0) return {};
vector<vector<int>> res(n,vector<int>(n,0));
res[0][0] = 1;
for(int j=2;j<=n*n;j++){
int a = x + dx[i];
int b = y + dy[i];
if(a>=n||a<0||b>=n||b<0||res[b][a]){
i=(i+1)%4;
a = x + dx[i];
b = y + dy[i];
}
x = a;
y = b;
res[b][a] = j;
}
return res;
}
};