【力扣hot100】【Leetcode 54】螺旋矩阵|边界控制 算法笔记及打卡(19/100)
【力扣】【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
参考解答:
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辅助生成):
#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; }