力扣54. 螺旋矩阵
给你一个 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]
参考了题解,做模拟就是不能偷懒,应该一步一步来,自己找规律写的总有样例会挂
1 class Solution { 2 public: 3 vector<int> result; 4 5 void travel(vector<vector<int>> matrix){ 6 int m=matrix.size(); //行数 7 int n=matrix[0].size(); //列数 8 int l=0,r=n-1,u=0,b=m-1; //定义四条边界 9 while(true){ 10 for(int i=l;i<=r;++i) 11 result.push_back(matrix[u][i]); 12 if (++u>b) 13 break; 14 for(int i=u;i<=b;++i) 15 result.push_back(matrix[i][r]); 16 if (--r<l) 17 break; 18 for(int i=r;i>=l;--i) 19 result.push_back(matrix[b][i]); 20 if (--b<u) 21 break; 22 for (int i=b;i>=u;--i) 23 result.push_back(matrix[i][l]); 24 if (++l>r) 25 break; 26 } 27 28 } 29 vector<int> spiralOrder(vector<vector<int>>& matrix) { 30 travel(matrix); 31 return result; 32 } 33 };
2025.9.18
1 class Solution { 2 public: 3 vector<int> spiralOrder(vector<vector<int>>& matrix) { 4 bool visit[15][15] = {false}; 5 int orient[8] = {0, 1, 1, 0, 0, -1, -1, 0}; // 按→↓←↑的顺序存储方向偏移值 6 vector<int> result; 7 int n = matrix.size(), m = matrix[0].size(); 8 int sum = m * n; 9 int x = 0, y = 0; 10 int orientation = 0; // 当前方向 11 int count = 0; 12 while(count < sum) { 13 if (!visit[x][y]) { 14 visit[x][y] = true; 15 result.push_back(matrix[x][y]); 16 count++; 17 } 18 int xx = x + orient[orientation * 2], yy = y + orient[orientation * 2 + 1]; 19 if (xx >= 0 && xx < n && yy >= 0 && yy < m && !visit[xx][yy]) { 20 x = xx, y = yy; 21 } else { 22 orientation = (orientation + 1) % 4; // 碰壁则更新方向 23 } 24 25 } 26 return result; 27 } 28 };
浙公网安备 33010602011771号