• 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;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
  • 相关阅读:
    如何把Word转换为PDF?这篇文章教会你怎么实现
    c++初阶-----STL---string的模拟实现
    正厚软件-软件测试用例设计方法之二-边界值
    基于SpringBoot的客户关系管理系统
    编译原理课程设计-对pl0语言进行扩充
    win10上修改docker的镜像文件存储位置
    java计算机毕业设计江智能股票推荐系统源码+mysql数据库+系统+lw文档+部署
    Mysql集群高可用架构MHA
    《博弈论》— 人生何处不博弈
    leetcode栈和队列
  • 原文地址:https://blog.csdn.net/vcz567/article/details/126136294