【LeetCode题解】59. 螺旋矩阵 II

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

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

 

题解:

  1. 尝试过用数学公式推导[row][col]的值,没推出来
  2. 只能用“真-螺旋”方法生成了,最外层循环次数是固定的,n^2次,且生成数也是从1 到 n^2,故生产数也可以作为循环控制变量
  3. 同上次螺旋矩阵I,从外层到内层依次访问,设置deep = 层深度,默认最外层deep=0层从 [0][0] 开始到 [1][0]结束,deep++,deep=1层从[1][1] 开始到 [2][1]结束,deep++,deep=3等以此类推.....可用n和deep很方便设置每次遍历范围
  4. 每层循环,先执行向右 j++,然后向下i++,再向左 j--,最后向上 i--,注意结尾位置并非起点,而且为了避免折返录入(见螺旋矩阵 I 3问题二),在向下、向左、向上时候要检测cnt是否应该结束循环
class Solution {
    public int[][] generateMatrix(int n) {
        int[][] ret = new int[n][n];
        //cnt = 当前存放数 deep = 层数,从0开始递增
        int x=0, y=0 ,cnt=1 ,deep = 0;
        while(cnt <= n*n){
            int i=deep , j=deep; 
            for( ; j<n-deep ; j++,cnt++){
                ret[i][j] = cnt;
            }
            for( i+=1,j-=1 ; i<n-deep && cnt<=n*n ; i++,cnt++){
                ret[i][j] = cnt;
            }
            for( j=n-2-deep,i-=1 ; j>=deep && cnt<=n*n ; j--,cnt++){
                ret[i][j] = cnt;
            }
            for( i=n-2-deep,j+=1 ; i>deep && cnt<=n*n ; i--,cnt++){
                ret[i][j] = cnt;
            }
            deep++;
        }
        return ret;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值