螺旋矩阵

原题:

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1: 54. 螺旋矩阵 - 图1

  1. 输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
  2. 输出:[1,2,3,6,9,8,7,4,5]

示例 2: 54. 螺旋矩阵 - 图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

解题方法:

解法一:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        int m = matrix.size(), n = matrix[0].size();
        const int size = m * n;
        int i = 0, j = 0;
        int left = 0, right = n - 1, up = 0, down = m - 1;
        while (res.size() < size)
        {
            for (i = left; i <= right; i++)   //1.遍历上方横排,遍历完之后,上方边界+1
            {
                res.push_back(matrix[j][i]);
            }
            i--;
            up++;

            for (j = up; j <= down; j++)      //2.遍历右方横排,遍历完之后,右方边界-1
            {
                res.push_back(matrix[j][i]);
            }
            j--;
            right--;


            for (i = right; i >= left; i--)   //3.遍历下方横排,遍历完之后,下方边界-1
            {
                res.push_back(matrix[j][i]);
            }
            i++;
            down--;


            for (j = down; j >= up; j--)      //4.遍历左方横排,遍历完之后,左方边界+1
            {
                res.push_back(matrix[j][i]);
            }
            j++;
            left++;
        }
        while (res.size() > size)             //如果是三行四列,或者四行三列这种不规整的,会重复放入,但放入的都在最后,删掉就是
        {
            res.pop_back();
        }
        return res;
    }
};

做题小结:

针对解法一:

  1. 重点就是要理解在res被填满之前,填入轨迹在矩阵中的运动逻辑,合理设置边界来对遍历进行限制