【力扣 54】螺旋矩阵 C++题解(向量+模拟+矩阵)

89 阅读1分钟

给你一个 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


思路

使用了一个双重循环,外层循环控制螺旋遍历的层数,内层循环控制在每一层中的具体遍历过程。遍历过程中,算法会根据当前的方向(由变量dir表示)来决定下一步的行动。dir的取值范围是0到3,分别代表向右、向下、向左、向上四个方向。

在每次遍历时,算法会根据当前的方向将矩阵中的元素添加到结果向量vr中,同时更新遍历的计数器cnt。当cnt达到矩阵的元素总数时,遍历结束。

此外,算法还使用了四个变量udlr来记录当前层的上下左右边界,这四个变量在每次遍历后会相应地更新,以确保下一次遍历时能正确地进入下一层。


AC代码

/*
 * @lc app=leetcode.cn id=54 lang=cpp
 *
 * [54] 螺旋矩阵
 */

// @lc code=start
class Solution {
   public:
	vector<int> spiralOrder(vector<vector<int>>& matrix) {
		vector<int> vr;
		int m = matrix.size();
		int n = matrix[0].size();
		int u, d, l, r;
		int x, y, dir;
		int cnt = 0;
		x = -1;
		y = 0;
		u = l = 0;
		r = n;
		d = m;
		dir = 0;
		while (cnt < m * n) {
			switch (dir) {
				case 0:
					do {
						x++;
						vr.push_back(matrix[y][x]);
						cnt++;
					} while (x + 1 < r);
					u++;
					break;
				case 1:
					do {
						y++;
						vr.push_back(matrix[y][x]);
						cnt++;
					} while (y + 1 < d);
					r--;
					break;
				case 2:
					do {
						x--;
						vr.push_back(matrix[y][x]);
						cnt++;
					} while (x - 1 >= l);
					d--;
					break;
				case 3:
					do {
						y--;
						vr.push_back(matrix[y][x]);
						cnt++;
					} while (y - 1 >= u);
					l++;
					break;
			}
			dir = (dir + 1) % 4;
		}
		return vr;
	}
};
// @lc code=end