Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
旋转打印数组。时间复杂度O(nm),空间复杂度O(nm)
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if (!matrix.size() || !matrix[0].size()) return ans;
int n = matrix.size(), m = matrix[0].size();
vector<vector<bool> > vis(n, vector<bool>(m, false));
int cnt = 0;
int i = 0, j = 0;
while (ans.size() < n * m) {
if (cnt == 0) {
ans.push_back(matrix[i][j]);
vis[i][j] = true;
j++;
if (j >= m || vis[i][j] == true) {
--j;
++i;
cnt = 1;
}
}
else if (cnt == 1) {
ans.push_back(matrix[i][j]);
vis[i][j] = true;
i++;
if (i >= n || vis[i][j] == true) {
--i;
--j;
cnt = 2;
}
}
else if (cnt == 2) {
ans.push_back(matrix[i][j]);
vis[i][j] = true;
j--;
if (j < 0 || vis[i][j] == true) {
++j;
--i;
cnt = 3;
}
}
else if (cnt == 3) {
ans.push_back(matrix[i][j]);
vis[i][j] = true;
--i;
if (i < 0 || vis[i][j] == true) {
++i;
++j;
cnt = 0;
}
}
}
return ans;
}
};
Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.
For example,
Given n = 3
,
[ [ 1, 2, 3 ], [ 8, 9, 4 ], [ 7, 6, 5 ] ]
旋转给数组赋值。时间复杂度O(nm),空间复杂度O(1)
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > ans(n, vector<int>(n, 0));
int dir = 0;
int cnt = 1;
int i = 0, j = 0;
while (cnt <= n * n) {
if (dir == 0) {
ans[i][j] = cnt;
++j;
++cnt;
if (j >= n || ans[i][j]) {
--j;
++i;
dir = 1;
}
}
else if (dir == 1) {
ans[i][j] = cnt;
++cnt;
++i;
if (i >= n || ans[i][j]) {
--i;
--j;
dir = 2;
}
}
else if (dir == 2) {
ans[i][j] = cnt;
++cnt;
--j;
if (j < 0 || ans[i][j]) {
++j;
--i;
dir = 3;
}
}
else if (dir == 3) {
ans[i][j] = cnt;
++cnt;
--i;
if (i < 0 || ans[i][j]) {
++i;
++j;
dir = 0;
}
}
}
return ans;
}
};