97.螺旋矩阵II

一、题目描述

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

在这里插入图片描述
在这里插入图片描述

二、解题思路

先参考我的96_螺旋矩阵方案一的代码,直接改改就可以了。

三、代码演示

方案一:直接模拟

class Solution {
    public int[][] generateMatrix(int n) {
        //使用2*4的数组:往右,往下,往左,往上,0表示不变,1是加1,-1是减1
        int[][] dirs = {{0,1},{1,0},{0,-1},{-1,0}};

        int row = 0, col = 0;
        //使用一个变量来控制方向,默认往右走
        int di = 0;
        //存放结果
        int[][] res = new int[n][n];
        //使用一个boolean来判断某个元素是否被访问
        boolean[][] seen = new boolean[n][n];

        for (int i=0; i<n*n; i++){
            //将值放到数组中
            res[row][col] = i+1;
            seen[row][col] = true;  //表示某个元素被访问

            //dirs是一个2行4列的数组,dirs[di][0]表示取出dirs中第di行的第1个元素
            int nextRow = row + dirs[di][0];  //表示行的变化
            int nextCol = col + dirs[di][1];  //表示列的变化

            if (nextRow<0 || nextRow>=n || nextCol<0 || nextCol>=n || seen[nextRow][nextCol]){
                //改变方向,四个方向,di表示0,1,2,3,dirs的四行
                di = (di+1)%4;
            }

            //更新初始行列
            row = row + dirs[di][0];
            col = col + dirs[di][1];
        }
        return res;
    }
}

方案二:按层模拟

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] res = new int[n][n];

        int startRow = 0, endRow = n - 1;
        int startCol = 0, endCol = n - 1;

        int i = 1;
        while (startRow <= endRow && startCol <= endCol) {
            // top 行
            for (int col = startCol; col <= endCol; col++){
                res[startRow][col] = i++;
            }
            // right 列
            for (int row = startRow + 1; row <= endRow; row++){
                res[row][endCol] = i++;
            }
            if (startRow < endRow && startCol < endCol) {
                // bottom 行
                for (int col = endCol - 1; col > startCol; col--) res[endRow][col] = i++;
                // left 列
                for (int row = endRow; row > startRow; row--) res[row][startCol] = i++;
            }
            startRow++;
            endRow--;
            startCol++;
            endCol--;
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值