boxmoe_header_banner_img

Hello! 欢迎来到不如画七的空间!

加载中

文章导读

06.螺旋矩阵


avatar
ensiezadi 2025年8月19日 54

[[模拟]]

螺旋矩阵

题目

给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

n = 4

具体思路

  • 设定每一轮的循环次数,循环起始位置,单层循环的长度。
  • 按照四个方向的遍历顺序进行遍历。

具体代码

Java

class Solution {
    public int[][] generateMatrix(int n) {
        int startX = 0;
        int startY = 0;
        int loop = n / 2;
        int[][] res = new int[n][n];
        int offset = 1;
        int num = 1;
        if (n % 2 == 1) {
            res[n / 2][n / 2] = n * n;
        }
        int i = n;
        while (loop > 0) {
            loop--;
            int xRay = startX;
            int yRay = startY;
            i = n;
            while (i - offset - startX > 0) {
                res[xRay][yRay] = num++;
                yRay++;
                i--;
            }
            i = n;
            while (i - offset - startX > 0) {
                res[xRay][yRay] = num++;
                xRay++;
                i--;
            }
            i = n;
            while (i - offset - startX > 0) {
                res[xRay][yRay] = num++;
                yRay--;
                i--;
            }
            i = n;
            while (i - offset - startX > 0) {
                res[xRay][yRay] = num++;
                xRay--;
                i--;
            }
            startX++;
            startY++;
            offset++;
        }
        return res;
    }
}

CPP

[[include]] <iostream>
[[include]] <vector>
using namespace std;

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n, n * n));
        int startIndex = 0;
        int count = 1;
        int value = 1;
        int row = 0;
        int column = 0;
        int loop = n / 2;
        for (int t = 0; t < loop; t++) {
            // 从左到右
            for (; column < n - count; column++) {
                res[row][column] = value;
                value++;
            }

            // 从上到下
            for (; row < n - count; row++) {
                res[row][column] = value;
                value++;
            }

            // 从右到左
            for (; column > count - 1; column--) {
                res[row][column] = value;
                value++;
            }

            // 从下到上
            for (; row > count - 1; row--) {
                res[row][column] = value;
                value++;
            }

            // 更新下一轮起点
            count++;
            column++;
            row++;
        }
        return res;
    }
};

int main() {
    int n = 6;
    Solution s;
    vector<vector<int>> res = s.generateMatrix(n);
    for (int i = 0; i < res.size(); i++) {
        for (int j = 0; j < res[i].size(); j++) {
            cout << res[i][j] << " ";
        }
        cout << endl;
    }
    return 0;
}

复杂度分析

  • 时间复杂度: O(n^2)。生成矩阵需要遍历 n^2 个元素,每个元素都被访问一次。
  • 空间复杂度: O(1)。除了返回结果矩阵外,使用的额外空间是常数级别的变量。


评论(0)

查看评论列表

暂无评论


发表评论

表情 颜文字
插入代码
不如画七
2025 年 10 月
 123456
78910111213
14151617181920
21222324252627
282930