LeetCode刷题-螺旋矩阵II

前言说明

算法学习,日常刷题记录。

题目连接

螺旋矩阵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

分析过程

此题和前面的文章"螺旋矩阵"有类似之处,请看文章:螺旋矩阵

螺旋矩阵:输入矩阵,输出矩阵的螺旋数组。

螺旋矩阵II(本题):输入矩阵边长,输出螺旋矩阵。

两题的思路差不多,但是过程相反。

例如:输入n = 6,那么矩阵如图所示:

矩阵1

加上颜色区分螺旋层数,如图所示:

矩阵2

再加上箭头表示螺旋的方向和轨迹,如图所示:

矩阵3

可以看出,螺旋是一层一层地来的,每一层的顺时针螺旋,按照向右、向下、向左、向上的方向移动,直到回到开始元素的下一行同一列的元素,然后开始下一层的顺时针螺旋,直到到达元素n^2,结束。

第一步

定义结果数组results,保存要返回的螺旋矩阵。

第二步

定义要累加的数字num,初始为1。

定义螺旋层数索引index,初始为0。

第三步

开始循环,从1累加到n^2,每次循环构造一层螺旋的元素,每次顺时针螺旋即为向右、向下、向左、向上移动。

第四步

每次循环,构造一层螺旋的元素:

1、向右移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。

行不变,值是:螺旋层数索引index。

列从左到右,范围是:[螺旋层数索引index,n - 螺旋层数索引index - 1]。

2、向下移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。

列不变,值是:n - 螺旋层数索引index - 1。

行从上到下,范围是:[螺旋层数索引index + 1,n - 螺旋层数索引index - 1]。

3、向左移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。

行不变,值是:n - 螺旋层数索引index - 1。

列从右到左,范围是:[n - 螺旋层数索引index - 2,螺旋层数索引index]。

4、向上移动,构造结果数组results的元素,构造完一个元素,要累加的数字num加1。

列不变,值是:螺旋层数索引index。

行从下到上,范围是:[n - 螺旋层数索引index - 2,螺旋层数索引index + 1]。

构造完一层螺旋的元素后:

螺旋层数索引index加1,最多加到n除以2加1就会结束循环,index <= n / 2 + 1。

第五步

循环结束,返回结果数组results。

解答代码

class Solution {
    public int[][] generateMatrix(int n) {
        // 定义结果数组
        int[][] results = new int[n][n];

        // 定义要累加的数字,初始为1
        int num = 1;
        // 定义螺旋层数索引,初始为0
        int index = 0;

        // 循环,从1累加到n的平方,每次循环构造一层螺旋的元素,每次顺时针螺旋即为向右、向下、向左、向上移动
        while (num <= n * n) {
            // 向右移动
            // 行不变,值是:螺旋层数索引
            // 列从左到右,范围是:螺旋层数索引 -> n - 螺旋层数索引 - 1
            for (int i = index; i < n - index; ++i) {
                results[index][i] = num++;
            }
                
            // 向下移动
            // 列不变,值是:n - 螺旋层数索引 - 1
            // 行从上到下,范围是:螺旋层数索引 + 1 -> n - 螺旋层数索引 - 1
            for (int i = index + 1; i < n - index; ++i) {
                results[i][n - index - 1] = num++;
            }

            // 向左移动
            // 行不变,值是:n - 螺旋层数索引 - 1
            // 列从右到左,范围是:n - 螺旋层数索引 - 2 -> 螺旋层数索引
            for (int i = n - index - 2; i >= index; --i) {
                results[n - index - 1][i] = num++;
            }
            
            // 向上移动
            // 列不变,值是:螺旋层数索引
            // 行从下到上,范围是:n - 螺旋层数索引 - 2 -> 螺旋层数索引 + 1
            for (int i = n - index - 2; i > index; --i) {
                results[i][index] = num++;
            }

            // 螺旋层数索引加1,最多加到n除以2加1就会结束循环,index <= n / 2 + 1
            ++index;
        }

        // 返回结果数组
        return results;
    }
}

提交结果

执行用时0ms,时间击败100.00%的用户,内存消耗36.1MB,空间击败98.41%的用户。

运行结果

原文链接

原文链接:螺旋矩阵II

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值