54. 螺旋矩阵 - 力扣(LeetCode)
给你一个 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
思路解析:
这道题思路很简单,就是设置一个点顺时针进行遍历,每次遍历完一条竖列或者一条横行的时候,都需要进行给自己的路径上设一堵墙,保证他后续不会再碰到遍历过的元素,当两堵墙上相邻时, 此时就遍历结束了,这时候判断的依据就是(你能走的最高的行小于你能走的最低的行,或者是你能走的最右边的列小于能走的最左边的列)
代码:
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> v;if(matrix.empty()){return v;}int left = 0, right = matrix[0].size() - 1, up = 0, low = matrix.size() - 1;while(true){//二维数组第一个元素是横行,第二个是数列//朝左,起始点是[up, left],up不变for(int i = left; i <=right; i++){v.push_back(matrix[up][i]);}//坐过一横行需要++设置墙,需要注意,一旦大于下墙标志着遍历结束if(++up > low){break;}//朝下,起始点是[up, right],right不变for(int i = up; i <= low; i++){v.push_back(matrix[i][right]);}//坐过一竖列需要--设置墙,需要注意,一旦小于左墙标志着遍历结束if(--right < left){break;}//朝右,起始点是[low, right],low不变for(int i = right; i >=left; i--){v.push_back(matrix[low][i]);}//坐过一横行需要--设置墙,需要注意,一旦小于上墙标志着遍历结束if(--low < up){break;}//朝上,起始点是[low, left],left不变for(int i = low; i >= up; i--){v.push_back(matrix[i][left]);}//坐过一竖行需要++设置墙,需要注意,一旦大于右墙标志着遍历结束if(++left > right){break;}}return v;}
};