D5 59.螺旋矩阵

59 螺旋矩阵(力扣:https://leetcode.cn/problems/spiral-matrix-ii/

条件:给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。(1 <= n <= 20)
Tips: 最开始的构想是使用行列遍历、每次到头时反转flag使得行列交替++或--,但是++和--的边界条件不同,没法在两个式子里同时满足,所以使用四个边界(上下左右),注意边界条件,如每次都是加到该行/列最后

初版代码:

点击查看代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {

        // 二维,先更新行再更新列
        // vector<vector<int>> matrix(n,vector<int>(n,0));
        int matrix[20][20] = {0};
        // 矩阵填充从1开始
        int value = 1;

        int left = 0, right = n - 1;
        int top = 0, bottom = n - 1;
        while (value <= n * n) {

            for (int i = left; i <= right; value++, i++) {
                matrix[top][i] = value;
            }
            top++;

            for (int i = top; i <= bottom; value++, i++) {
                matrix[i][right] = value;
            }
            right--;

            for (int i = right; i >= left; value++, i--) {
                matrix[bottom][i] = value;
            }
            bottom--;

            for (int i = bottom; i >= top; value++, i--) {
                matrix[i][left] = value;
            }
            left++;
        }

        return matrix[][];
    }
};

以下为初版行列遍历代码(无法运行

点击查看代码
class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        //二维,先更新行再更新列
        vector<vector<int>> matrix(n,vector<int>(n,0));

        //矩阵填充从1开始
        int value = 1;
        int column = 0;
        int row = 0;



        // 标志位决定行列++还是--,结尾元素坐标为(n-1,n-1)
        for(signed char flag = 1; column != n-1 && row != n-1;  flag *= -1){
            
        //先执行--行不动列增加
        for(; column < n && column > 0; column += flag, value++){
            matrix[n][column] = value;
        }
        //再执行--列不动行增加
        for(; row < n && row > 0; row += flag, value++){
            matrix[row][n] = value;
        }

        //完成后n需要减小一位
        n--;
        //反转标志位,++变--
        }

        return matrix;
    }
};
posted @ 2026-01-13 23:52  SCONLY  阅读(6)  评论(0)    收藏  举报