本题主要考察代码能力
题目描述:
题号:54
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解题思路:
思路一:逐层打印
顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。
算法思路:
循环打印:“从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。打印之后向内收缩一行。
时间复杂度:O(M*N)
空间复杂度:O(1)
C++
// C++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if(matrix.size() == 0 || matrix[0].size() == 0) {
return {};
}
int left = 0, right = matrix[0].size() - 1, top = 0, bottom = matrix.size() - 1;
vector<int> answer;
while (true) {
// 左 到 右
for (int i = left; i <= right; i++) answer.push_back(matrix[top][i]);
if (++top > bottom) break;
// 上 到 下
for (int i = top; i <= bottom; i++) answer.push_back(matrix[i][right]);
if (left > --right) break;
// 右 到 左
for (int i = right; i >= left; i--) answer.push_back(matrix[bottom][i]);
if (top > --bottom) break;
// 下 到 上
for (int i = bottom; i >= top; i--) answer.push_back(matrix[i][left]);
if (++left > right) break;
}
return answer;
}
};
go
// go
func spiralOrder(matrix [][]int) []int {
if len(matrix) == 0 || len(matrix[0]) == 0 {
return nil
}
left, right, top, bottom := 0, len(matrix[0]) - 1, 0, len(matrix) - 1;
answer := make([]int, 0)
for true {
// 左 到 右
for i := left; i <= right; i++ {
answer = append(answer ,matrix[top][i])
}
top += 1
if top > bottom {
break;
}
// 上 到 下
for i := top; i <= bottom; i++ {
answer = append(answer ,matrix[i][right])
}
right -= 1
if (left > right) {
break;
}
// 右 到 左
for i := right; i >= left; i-- {
answer = append(answer ,matrix[bottom][i])
}
bottom -= 1
if top > bottom {
break;
}
// 下 到 上
for i := bottom; i >= top; i-- {
answer = append(answer ,matrix[i][left])
}
left += 1
if left > right {
break;
}
}
return answer;
}