LeetCode 59.螺旋矩阵II

题目描述

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= n <= 20

思路

本题笔者使用模拟的方法来解决,通过代码模拟顺时针画矩阵的过程。时间复杂度为 O(n^2)。

代码

C++版:

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> result(n,vector<int>(n));
        int x=1,count=1;
        int i,j;
        int s1=0,s2=0; // 起始点
        int loop=n/2;
        // 每个圈循环一次,共有n/2个圈
        while(loop--){
            i=s1;
            j=s2;
            for(j;j<n-x;j++){
                result[i][j]=count++;
            }
            for(i;i<n-x;i++){
                result[i][j]=count++;
            }
            for(;j>s2;j--){
                result[i][j]=count++;
            }
            for(;i>s1;i--){
                result[i][j]=count++;
            }
            s1++;
            s2++;
            x++;
        }
        // 当n为奇数时,需要单独处理中间的点
        if(n%2==1) result[n/2][n/2]=count;
        return result;
    }
};

Python版:

class Solution:
    def generateMatrix(self, n: int) -> List[List[int]]:
        result=[[0]*n for _ in range(n)]
        x=1
        count=1
        s1=0
        s2=0
        loop=n // 2
        while loop!=0 :
            for i in range(s2, n - x) :    
                result[s1][i] = count
                count += 1
            for i in range(s1, n - x) :   
                result[i][n-x] = count
                count += 1
            for i in range(n - x, s2, -1) :   
                result[n-x][i] = count
                count += 1
            for i in range(n - x, s1, -1) :   
                result[i][s2] = count
                count += 1
            s1+=1
            s2+=1
            x+=1
            loop-=1
        if n % 2 != 0 : # n为奇数时,填充中心点
            result[n // 2][n // 2] = count
        return result

需要注意的地方

1.在做螺旋矩阵这一类型题目的时候也要遵循循环不变量的原则,本题中的不变量:处理某一条边时从第一个节点开始处理,但是不处理最后一个节点。

2.当n为奇数时,中间的一点不能视作一圈,需要单独处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值