给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。 数据范围: 0 ≤ � , � ≤ 10 0≤n,m≤10,矩阵中任意元素都满足 ∣ � � � ∣ ≤ 100 ∣val∣≤100 要求:空间复杂度 � ( � � ) O(nm) ,时间复杂度 � ( � � ) O(nm)
时间: 2023-12-11 16:04:17 浏览: 68
好的,这是一个比较经典的矩阵题目。我可以给你提供一种解法。
我们可以使用模拟的方法,按照螺旋的顺序遍历整个矩阵。具体来说,我们可以使用四个指针,分别表示当前遍历到的上下左右四个边界。每次遍历完一条边,我们就将对应的边界向内缩小一格,并且判断是否遍历完了整个矩阵。如果没有遍历完整个矩阵,就继续按照螺旋的顺序遍历下一条边。
具体的实现细节可以参考下面的代码:
```
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if (matrix.empty()) return res;
int m = matrix.size(), n = matrix[0].size();
int up = 0, down = m - 1, left = 0, right = n - 1;
while (true) {
// 从左到右遍历上边界
for (int j = left; j <= right; j++) res.push_back(matrix[up][j]);
if (++up > down) break; // 上边界向内收缩
// 从上到下遍历右边界
for (int i = up; i <= down; i++) res.push_back(matrix[i][right]);
if (--right < left) break; // 右边界向内收缩
// 从右到左遍历下边界
for (int j = right; j >= left; j--) res.push_back(matrix[down][j]);
if (--down < up) break; // 下边界向内收缩
// 从下到上遍历左边界
for (int i = down; i >= up; i--) res.push_back(matrix[i][left]);
if (++left > right) break; // 左边界向内收缩
}
return res;
}
};
```
时间复杂度是 O(nm),空间复杂度是 O(nm)。
阅读全文