【力扣】【Leetcode 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]
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
参考解答:
c++
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if (matrix.empty()) return ans;
int m = matrix.size(), n = matrix[0].size();
int top = 0, bottom = m - 1; //上下边界
int left = 0, right = n - 1; //左右边界
while (true) {
// 左 → 右
for (int i = left; i <= right; ++i) ans.push_back(matrix[top][i]);
if (++top > bottom) break; //等效于++top; if (top > bottom) break;
// 上 → 下
for (int i = top; i <= bottom; ++i) ans.push_back(matrix[i][right]);
if (--right < left) break;
// 右 → 左
for (int i = right; i >= left; --i) ans.push_back(matrix[bottom][i]);
if (--bottom < top) break;
// 下 → 上
for (int i = bottom; i >= top; --i) ans.push_back(matrix[i][left]);
if (++left > right) break;
}
return ans;
}
};
完整解法(由LLM辅助生成):
c++
#include <iostream>
#include <vector>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
vector<vector<int>> matrix(m, vector<int>(n));
// 输入矩阵
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> matrix[i][j];
}
}
vector<int> ans;
// 四个边界
int top = 0;
int bottom = m - 1;
int left = 0;
int right = n - 1;
while (true) {
// 1. 左 → 右
for (int i = left; i <= right; i++) ans.push_back(matrix[top][i]);
top++;
if (top > bottom) break;
// 2. 上 → 下
for (int i = top; i <= bottom; i++) ans.push_back(matrix[i][right]);
right--;
if (left > right) break;
// 3. 右 → 左
for (int i = right; i >= left; i--) ans.push_back(matrix[bottom][i]);
bottom--;
if (top > bottom) break;
// 4. 下 → 上
for (int i = bottom; i >= top; i--) ans.push_back(matrix[i][left]);
left++;
if (left > right) break;
}
// 输出结果
for (int x : ans) cout << x << " ";
cout << endl;
return 0;
}