19 螺旋矩阵

螺旋矩阵

    • 题解1 循环(4个标志——根据顺时针)
    • 题解2 方向

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

19 螺旋矩阵_第1张图片
提示:

 - m == matrix.length 
 - n == matrix[i].length 
 - 1 <= m, n <= 10
 - -100 <= matrix[i][j] <= 100

题解1 循环(4个标志——根据顺时针)

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        const int row = matrix.size();
        const int column = matrix[0].size();
        vector<int> res;
        int i(0), j (0), startR(0), endR(column-1), startC(0), endC(row-1);
        while(startC <= endC){
            
            i = startC;
            j = startR;
            
            if(j <= endR){
                while(j <= endR)
                // i = startC
                res.push_back(matrix[i][j++]);
                startC ++;
                i ++;
            }else break;
            
            if(i <= endC){
                j = endR;
                while(i <= endC)
                    // j = endR
                    res.push_back(matrix[i++][j]);
                endR --;
                j --;
            }else break;
            
            if(j >= startR){
                i = endC;
                while(j >= startR)
                    // i = endC
                    res.push_back(matrix[i][j--]);
                endC --;
                i --;
            }else break;
            
            if(i >= startC){
                j = startR;
                while(i >= startC)
                // j = startR
                    res.push_back(matrix[i--][j]);
                startR ++;
            }else break;
        }

        return res;
    }
};

19 螺旋矩阵_第2张图片

题解2 方向

class Solution {
private:
// 向右、向下、向左、向上
    static constexpr int directions[4][2] = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        if (matrix.size() == 0 || matrix[0].size() == 0) {
            return {};
        }
        
        int rows = matrix.size(), columns = matrix[0].size();
        vector<vector<bool>> visited(rows, vector<bool>(columns));
        int total = rows * columns;
        vector<int> order(total);

        int row = 0, column = 0;
        int directionIndex = 0;
        // 终止条件是 元素数目
        for (int i = 0; i < total; i++) {
            order[i] = matrix[row][column];
            visited[row][column] = true;
            int nextRow = row + directions[directionIndex][0], nextColumn = column + directions[directionIndex][1];
            if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) {
                directionIndex = (directionIndex + 1) % 4;
            }
            row += directions[directionIndex][0];
            column += directions[directionIndex][1];
        }
        return order;
    }
};

19 螺旋矩阵_第3张图片

你可能感兴趣的:(矩阵循环,HOT100,leetcode,数据结构,算法)