代码随想录Day2 | 螺旋矩阵II - Java

本文介绍了一种生成包含1到n^2元素的n×n正方形矩阵,按照顺时针螺旋顺序排列的方法。通过控制循环次数、边填充规则和处理奇数边长中心点,给出了详细的算法步骤和Java代码实现。
摘要由CSDN通过智能技术生成

题目

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

示例

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

解释:

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

思路

这道题不需要用到任何算法,但是做这道题前我们需要解决几个问题:

1. 这个螺旋矩阵要转几圈?

2. 每条边怎么去填入数字?

3. 对于奇数边长无法通过循环填充的中心点,应该怎么办?

在不考虑奇数边长中心点的前提下,第一个问题的答案是n/2(n是输入的边长)。第一次转一圈每边的边长就是n,而下一次的螺旋的边长就变成了n-2,因为对于每条边来说,两端的空格都已经被填满了,不需要再次填充。以此类推,螺旋矩阵要转几圈的问题就变成了n可以减几次2,答案也就显而易见,是n/2的取整了。

在填充的过程中,我们希望每条边都是有规律的去填充,而不是第一条边填充3个,第二条边填充四个这样。因此我们规定在填充每条边时都遵循左闭右开的原则,下面这张图或许能够帮助理解:

第三个问题,其实非常简单。我们只需要在循环外加一个if条件去判断是不是奇数边即可。如果是奇数边,找到中心位置填充剩余的数字即可。

代码实现

class Solution {
    public int[][] generateMatrix(int n) {
        int loop = 0;  // 控制循环次数
        int[][] result = new int[n][n];
        int start = 0;  // 每次循环的开始点(start, start)
        int count = 1;  // 定义填充数字
        int i, j;

        while(loop++ < n/2){
            for(j = start; j < n - loop; j++){  //从左到右
                result[start][j] = count++;
            }

            for(i = start; i < n - loop; i++){  //从上到下
                result[i][j] = count++;
            }

            for(; j >= loop; j--){  //从右到左
                result[i][j] = count++;
            }

            for(; i >= loop; i--){  //从下到上
                result[i][j] = count++;
            }

            start++; //改变每次转圈的起始点
        }

        if(n%2 == 1){
            result[start][start] = count;
        }

        return result;
    }
}

这里我们每一次循环都遵循从左到右,从上到下,再从右到左,最后从下到上的顺序。

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值