1. 题目

Given an integer n, generate a square matrix filled with elements from 1 to n2 in spiral order.

For example,
Given n = 3,

You should return the following matrix:
[
[ 1, 2, 3 ],
[ 8, 9, 4 ],
[ 7, 6, 5 ]
]

2. 思路

是之前的Spiral Matrix的简化版本,https://segmentfault.com/a/11...

3. 代码

class Solution {
public:
    // 一圈圈的转,每次转最外面的一圈。
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> matrix;
        for (int i = 0; i < n; i++) {
            matrix.push_back(vector<int>());
            vector<int>& r = matrix.back();
            for (int j = 0; j < n; j++) {
                r.push_back(0);
            }
        }
        int ki = 0;
        int kj = 0; // 左上顶点的坐标
        if (n == 0) {return matrix;}
        int cnt = 1;
        while (ki < (n+1)/2) {
            // 最后单点
            if (kj == n-kj-1) {
                for (int i = ki; i < n-ki; i++) {
                    matrix[i][n-kj-1] = cnt++;
                }
                return matrix;
            }
            
            // 上行[ki, kj] -> [ki, n-kj-1]
            for (int j = kj; j < n-kj-1; j++) {
                matrix[ki][j] = cnt++;
            }
            // 右竖[ki, n-kj-1] -> [m-ki-1, n-kj-1]
            for (int i = ki; i < n-ki-1; i++) {
                matrix[i][n-kj-1] = cnt++;
            }
            // 下行[m-ki-1, kj] <- [m-ki-1, n-kj-1]
            for (int j = n-kj-1; j > kj; j--) {
                matrix[n-ki-1][j] = cnt++;
            }
            // 左竖[ki, kj] <- [m-ki-1, kj]
            for (int i = n-ki-1; i > ki; i--) {
                matrix[i][kj] = cnt++;
            }
            ki++;
            kj++;
        }
        return matrix;
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书