LeetCode 59. 螺旋矩阵 II 按层模拟

133 阅读1分钟

题目描述

题目来源:力扣(LeetCode)
题目链接:59. 螺旋矩阵 II

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:

输入: n = 1
输出: [[1]]

示例 2:

spiraln.jpg

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

提示:

  • 1 <= n <= 20

解题方法:按层模拟

思路

从最外层向内层遍历,待处理元素形成一个矩阵,由四个边界变量确定(包含边界)。
为了顺时针遍历,依次遍历待处理元素矩阵的上侧、右侧、下侧、左侧部分。

代码

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        // up, down, left, right 确定一个待处理元素形成的矩阵,包含边界
        // num 表示当前填充元素,border 表示填充元素边界
        int up = 0, down = n - 1, left = 0, right = n - 1, num = 1, border = n * n;
        // ans 为结果数组
        vector<vector<int>> ans(n, vector<int>(n));
        // 循环不变式
        while(num <= border) {
            // 遍历待处理元素矩阵的最上侧部分
            for(int i = left; i <= right && num <= border; ++i) {
                ans[up][i] = num++;
            }
            // 剔除最上侧部分
            ++up;
            // 遍历待处理元素矩阵的最右侧部分
            for(int i = up; i <= down && num <= border; ++i) {
                ans[i][right] = num++;
            }
            // 剔除最右侧部分
            --right;
            // 遍历待处理元素矩阵的最下侧部分
            for(int i = right; i >= left && num <= border; --i) {
                ans[down][i] = num++;
            }
            // 剔除最下侧部分
            --down;
            // 遍历待处理元素矩阵的最左侧部分
            for(int i = down; i >= up && num <= border; --i) {
                ans[i][left] = num++;
            }
            // 剔除最左侧部分
            ++left;
        }
        // 方法结果数组
        return ans;
    }
};