一、题目描述
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
二、测试用例
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
三、解题思路
- 基本思路:
一力破万法,就是按照螺旋矩阵的方式添加元素到向量中。 - 具体思路:
- 定义:constrain 表示四个方向的界限,其中 up 和 left 初始为 0 ,down 和 right 初始为 n-1 和 m-1 ;ans 用于存放答案。
- 遍历:
- 往右:把 left 到 right 的元素依次添加到 ans 中,然后这一排的元素都添加完了,up++ 。
- 往下:把 up 到 down 的元素依次添加到 ans 中,然后这一列的元素都添加完了,right-- 。顺便判断是否结束。
- 往左:把 right 到 left 的元素依次添加到 ans 中,然后这一排的元素都添加完了,down-- 。
- 往上:把 down 到 up 的元素依次添加到 ans 中,然后这一列的元素都添加完了,left++ 。顺便判断是否结束。
- 返回结果 ans 。
四、参考代码
时间复杂度:
O
(
n
m
)
\Omicron(nm)
O(nm)
空间复杂度:
O
(
1
)
\Omicron(1)
O(1)
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int n = matrix.size(), m = matrix[0].size(), len = n * m;
int d = 0;
vector<int> ans;
map<string, int> constrain = {{"up", 0}, {"down", n - 1}, {"left", 0}, {"right", m - 1}};
while (true) {
for (int j = constrain["left"]; j <= constrain["right"]; j++) { // 往右
ans.push_back(matrix[constrain["up"]][j]);
}
constrain["up"]++;
for (int j = constrain["up"]; j <= constrain["down"]; j++) { // 往下
ans.push_back(matrix[j][constrain["right"]]);
}
constrain["right"]--;
if (constrain["left"] > constrain["right"] || constrain["up"] > constrain["down"]) {
break;
}
for (int j = constrain["right"]; j >= constrain["left"]; j--) { // 往左
ans.push_back(matrix[constrain["down"]][j]);
}
constrain["down"]--;
for (int j = constrain["down"]; j >= constrain["up"]; j--) { // 往上
ans.push_back(matrix[j][constrain["left"]]);
}
constrain["left"]++;
if (constrain["left"] > constrain["right"] || constrain["up"] > constrain["down"]) {
break;
}
}
return ans;
}
};