2、59. 螺旋矩阵 II-数组-代码随想录

题目描述:

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

思路:没有思路

这道题不涉及太多的算法!主要就是对数组问题中边界条件的处理

结合二分法的两种情况!一个重要的概念就是循环不变量

就是要看,每次循环时,也就是一层循环中,区间的选择,最后会不会出现情况遗失或者多余情况重复循环!

经典的左闭右开和左开右闭

结合本题的情况就是,如下图:注意到时拐角处的处理

 代码:

1)左闭右开的情况,出现错误,在n为奇数时,最中间的内容会无法放入:

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        //有四种情况的添加方式
        //a记录上边,b记录右边,c记录下边,d记录左边
        int a = 0,b = n-1,c = n-1,d = 0;//最开始的外围记录

        //以要添加的数字作为 判断标准,最开始是1,以n的平方结尾
        int num = 1,target = n * n;
        while(num <= target){
            //每次进来依次添加四条边
            //这样的方式为左闭右开
            for(int i = d;i < b;i++) res[a][i] = num++;
            for(int i = a;i < c;i++) res[i][b] = num++;
            for(int i = b;i > d;i--) res[c][i] = num++;
            for(int i = c;i > a;i--) res[i][d] = num++;
            a++;
            b--;
            c--;
            d++;
        }
        return res;
    }
}

 2)左开右闭的情况:正确的

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];
        //有四种情况的添加方式
        //a记录上边,b记录右边,c记录下边,d记录左边
        int a = 0,b = n-1,c = n-1,d = 0;//最开始的外围记录

        //以要添加的数字作为 判断标准,最开始是1,以n的平方结尾
        int num = 1,target = n * n;
        while(num <= target){
            //每次进来依次添加四条边
            for(int i = d;i <= b;i++){
                res[a][i] = num++;
            }a++;
            for(int i = a;i <= c;i++){
                res[i][b] = num++;
            }b--;
            for(int i = b;i >= d;i--){
                res[c][i] = num++;
            }c--;
            for(int i = c;i >= a;i--){
                res[i][d] = num++;
            }d++;
        }
        return res;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值