力扣54题——螺旋矩阵

100 阅读1分钟

54. 螺旋矩阵

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

示例 1:

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

思路

  1. 把矩阵当成积木一样,积木是由行和列堆叠而成的,所以我没记录积木的行和列的开始和结尾坐标
  2. 遍历一行的实质就是把积木拆解一行,所以记录下拆下的那一行就可以了
  3. 当所有行和列完全被拆除时,循环结束

代码:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int c = 0;
        int r = 0;
        int cm = matrix[0].size() - 1;
        int rm = matrix.size() - 1;
        vector<int> res((cm + 1) * (rm + 1));
        int oper = 0; // 0 1 2 3
        int count = 0; // 记录当前记录的数组,防止数组扩容(性能优化)
        while(c <= cm && r <= rm) {
            switch(oper) {
                case 0:
                    for(int i = c; i <= cm; i++) res[count++] = matrix[r][i];
                    r++;
                    break;
                case 1:
                    for(int i = r; i <= rm; i++) res[count++] = matrix[i][cm];
                    cm--;
                    break;
                case 2:
                    for(int i = cm; i >= c; i--) res[count++] = matrix[rm][i];
                    rm--;
                    break;
                case 3:
                    for(int i = rm; i >= r; i--) res[count++] = matrix[i][c];
                    c++;
                    break;
            }
            oper = (oper + 1) % 4;
        }
        return res;
    }
};