LeedCode#59. 螺旋矩阵 II

LeedCode#59. 螺旋矩阵 II

题目简介

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

示例一

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

示例二

输入:n = 4
输出:[[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]

示例三

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

思想逻辑

  • 实现:二维数组
  • 逻辑:循环不变量原则
  • 思想:对每一条边的处理规则要相同,左闭右开[ 0 、1、2 )
  • 这里设定为:n == 4
  • 上侧从左到右:start在二维数组第零行的位置上,stack不动,j++,不断给第零行且第零一二列赋值(1、2、3),当j == 3时,for循环停止,j当好卡在第零行第三列(0,3)上。
  • 右侧从上到下:此时 i 蠢蠢欲动,当 i 得知 j 正卡在(0,3)的位置上不能动时,i 知道自己的机会来了,于是 i 开始往下跑,并没有忘记沿途放上元素(4,5,6)们,但 i 忘记了自己也最大 == 3,于是 i 也卡在了第三行第三列(3,3)上,i 不得不等 j 过来……
  • 下侧从右到左:当 j 知道因为自己卡在第零行第三列(0,3)的位置上,而 i 舍弃自己而跑时,j 奋起往回追,打算来一波秦王绕柱,利用 i 与自己相差对角线的距离,投射放上元素(7,8,9),直到跑到第三行第零列(3,0)的位置上累的喘不过气才停下来。
  • 左侧从下到上:i 没有看见 j 过来于是心里猜想(这小子估计是该原点哪堵我,刚才看见有三个元素飞了过去,哪它就是知道我的位置,你不仁就别怪我不义了!),于是 i 猜到 j 的位置之后,也往回走投射了(10、11)两个元素,但i不想j那么有活力走到第二行第零列就不走了。

剩下的自行脑部吧,博主该图书馆笑了一路,哈哈哈哈哈哈哈

代码如下

class Solution {
    public int[][] generateMatrix(int n) {
        int temp = 0;
        int[][] numbers = new int[n][n];
        int start = 0;
        int count = 1;
        int i, j;
        while(temp++ < n / 2) {
            //上侧从左到右:
            for(j = start; j < n - temp; j++){
                numbers[start][j] = count++;
            }
            //右侧从上到下:
            for(i = start; i < n - temp; i++){
                numbers[i][j] = count++;
            }
            //下侧从右到左:
            for(; j >= temp; j--){
                numbers[i][j] = count++;
            }
            //左侧从下到上:
            for(; i >= temp; i--){
                numbers[i][j] = count++;
            }
            start++;
        }
        if(n % 2 == 1){
            numbers[start][start] = count;
        }
    return numbers;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NumberTwoPlayer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值