LeetCode59-螺旋矩阵||

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

示例 1:
在这里插入图片描述
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:
输入:n = 1
输出:[ [1] ]

读题获取信息

  1. 生成的是正整数的正方形
  2. 因此如果 n为偶数,那么正方形由 多个 循环圈数组成,如 n=4 时,如下图所示,正方形由 外圈 1-12 和 内圈 13-16 组成
    | 1 | 2 | 3 | 4 |
    | ---- | ---- | ---- | ---- |
    | 12 | 13 | 14 | 5 |
    | 11 | 16 | 15 | 6 |
    | 10 | 9 | 8 | 7 |
  3. 如果 n为奇数,那么正方形由 多个循环圈数 再加 1个数组成

思路
综上可以想到

  1. 按题目要求顺时针 循环赋值,循环的条件就是 旋转的圈数(n/2),
    n = 3,转一圈,加一个数
    n = 4,转两圈
    n = 5,转两圈,加一个数
    n = 6,转三圈
  2. 再细化每一圈,顺时针赋值可分为四个部分,从左到右,从上到下,从右到左,从下到上
  3. 每一部分都通过一个 for循环来进行判断赋值
  4. 重点在于每一部分的都要保持 循环不变量,也就是保证左闭右开或者左闭右闭

本题使用了左闭右开的形式

代码实现

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] arr = new int[n][n];
        if(n==1){
            return new int[][]{{1}};
        }
        //赋的值
        int count = 1;
        //offset用于处理 圈数递增后 判断范围的相应改变
        int offset = 1;
        //x,y代表 每圈的起始位置
        int x=0,y=0;
        //p,q用于循环赋值指代 二维数据具体位置
        int p=0,q=0;
        //循环圈数
        int loop = 0;

        while(loop<n/2){
        	//处理圈数的第一部分,下面的循环依此类推
        		// n-offset 代表 右开,代入数字即很好理解
            for( q=y; q<n-offset ;q++){
                arr[x][q] = count++;
            }
            for(p=x;p<n-offset;p++){
                arr[p][q] = count++;
            }
            	//q > y也是如此,代表右开
            for(;q>y;q--){
                arr[p][q] = count++;
            }
            for(;p>x;p--){
                arr[p][q] = count++;
            }
            //赋值完一圈之后,走下一圈
            loop++;
            //走一下圈,对应的 判断范围也需要相应修改
            offset++;
            //走一下圈,那么许愿起始位置也更换
            x++;
            y++;
        }
        //当n为奇数时,多出的一个数直接赋值即可,注意此处是xy,指向新的起始位置;
        if(n%2==1){
            arr[x][y] = count;
        }
        return arr;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值