2021/3/16 54. 螺旋矩阵(模拟)
按照行列简单的模拟即可
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
vector<int> ans(rows*cols);
int cnt = 0;
int a1 = 0, a2 = rows - 1, b1 = 0, b2 = cols - 1;
while(cnt < rows * cols){
for(int i = b1; i <= b2; i++){
if(cnt >= rows*cols) break;
ans[cnt] = matrix[a1][i];
cnt++;
}
a1++;
for(int i = a1; i < a2; i++){
if(cnt >= rows*cols) break;
ans[cnt] = matrix[i][b2];
cnt++;
}
for(int i = b2; i >= b1; i--){
if(cnt >= rows*cols) break;
ans[cnt] = matrix[a2][i];
cnt++;
}
a2--;
for(int i = a2; i >= a1; i--){
if(cnt >= rows*cols) break;
ans[cnt] = matrix[i][b1];
cnt++;
}
b1++;
b2--;
}
return ans;
}
};
2021/3/16 59. 螺旋矩阵 II(模拟)
跟昨天的题目一样,模拟就好了
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n));
int cnt = 1;
int a1 = 0, a2 = n - 1, b1 = 0, b2 = n - 1; //a1 a2 b1 b2分别表示剩余待填充矩阵的最上 最下 最左和最右
while(cnt <= n * n){
for(int i = b1; i <= b2; i++){
if(cnt>n*n) break;
ans[a1][i] = cnt;
cnt++;
}
a1++;
for(int i = a1; i < a2; i++){
if(cnt>n*n) break;
ans[i][b2] = cnt;
cnt++;
}
for(int i = b2; i >= b1; i--){
if(cnt>n*n) break;
ans[a2][i] = cnt;
cnt++;
}
a2--;
for(int i = a2; i >= a1; i--){
if(cnt>n*n) break;
ans[i][b1] = cnt;
cnt++;
}
b1++, b2--;
}
return ans;
}
};