class Solution {
public int[] spiralOrder(int[][] matrix) {
if (matrix.length == 0 || matrix[0].length == 0)
return new int[0];
int n = matrix.length, m = matrix[0].length;
int[] ans = new int[n * m];
boolean[][] vis = new boolean[n][m];
int x = 0, y = 0;
ans[0] = matrix[0][0];
vis[x][y] = true;
int[] dx = {0, 1, 0, -1};
int[] dy = {1, 0, -1, 0};
int d = 0;
for (int i = 1; i < n * m; i++) {
int nx = x + dx[d], ny = y + dy[d];
while (!(nx >= 0 && nx < n &&
ny >= 0 && ny < m && !vis[nx][ny])) {
d = (d + 1) % 4;
nx = x + dx[d]; ny = y + dy[d];
}
x = nx; y = ny;
vis[x][y] = true;
ans[i] = matrix[x][y];
}
return ans;
}
}
var spiralOrder = function(matrix) {
if (matrix.length === 0) {
return [];
}
let left = 0;
let right = matrix[0].length - 1;
let up = 0;
let down = matrix.length - 1;
let res = [];
while (left <= right && up <= down) {
// 从左到右
for (let i = left; i <= right; i++) {
res.push(matrix[up][i]);
}
up = up + 1;
if (up > down) break;
// 从上到下
for (let j = up; j <= down; j++) {
res.push(matrix[j][right]);
}
right = right - 1;
if (left > right) break;
// 从右到左
for (let z = right; z >= left; z--) {
res.push(matrix[down][z])
}
down = down - 1;
// 从下到上
for (let d = down; d >= up; d--) {
res.push(matrix[d][left])
}
left = left + 1
}
return res;
};
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.size() == 0 || matrix[0].size() == 0)
return {};
vector<int> res;
int top = 0; //上边界
int bottom = matrix.size() - 1; //下边界
int left = 0; //左边界
int right = matrix[0].size() - 1; //右边界
while (true) {
// 从左到右
for (int i = left; i <= right; ++ i)
res.push_back(matrix[top][i]);
// 每次从左往右执行一次,则要往下移一层
if (++ top > bottom) break;
// 从上到下
for (int i = top; i <= bottom; ++ i)
res.push_back(matrix[i][right]);
// 每次从上到下执行一次,则要往左移一列
if (-- right < left) break;
// 从右到左
for (int i = right; i >= left; -- i)
res.push_back(matrix[bottom][i]);
// 每次从右到左执行一次,则要往上移一行
if (-- bottom < top) break;
// 从下到上
for (int i = bottom; i >= top; -- i)
res.push_back(matrix[i][left]);
// 每次从下到上执行一次,则要往右移一列
if (++ left > right) break;
}
return res;
}
};
共以下 9 个回答
恶心题,考验基本功
下面代码
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
时间复杂度O(NM)空间复杂度O(NM)
时间复杂度O(m*n),空间复杂度O(1)