Skip to content

Latest commit

 

History

History
44 lines (43 loc) · 1.09 KB

File metadata and controls

44 lines (43 loc) · 1.09 KB
  • 记录上下左右四个边界,每轮循环依次沿上边界向右、沿右边界向下、沿下边界向左、沿左边界向上,按顺时针方向走一圈。每次走完一个方向,更新走过的边界值,如果边界溢出,则无路可走,退出循环
class Solution {
 public:
  vector<int> spiralOrder(vector<vector<int>>& matrix) {
    vector<int> res;
    if (empty(matrix) || empty(matrix[0])) {
      return res;
    }
    int u = 0;
    int d = size(matrix) - 1;
    int l = 0;
    int r = size(matrix[0]) - 1;
    while (true) {
      for (int i = l; i <= r; ++i) {
        res.emplace_back(matrix[u][i]);
      }
      if (++u > d) {
        break;
      }
      for (int i = u; i <= d; ++i) {
        res.emplace_back(matrix[i][r]);
      }
      if (--r < l) {
        break;
      }
      for (int i = r; i >= l; --i) {
        res.emplace_back(matrix[d][i]);
      }
      if (--d < u) {
        break;
      }
      for (int i = d; i >= u; --i) {
        res.emplace_back(matrix[i][l]);
      }
      if (++l > r) {
        break;
      }
    }
    return res;
  }
};