LeetCode 59. 螺旋矩阵 II

59. 螺旋矩阵 II

题解:java 模拟 逻辑简单 注释清晰 时间击败100%

原题描述

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

示例 1:

 

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

示例 2: 

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

思路

创建二维矩阵,用变量记录遍历元素,顺时针将元素填充矩阵中。

解题方法

1. 初始化变量,确定遍历条件

//初始化变量
int[][] matrix = new int[n][n];
int x=0,y=0,h=matrix.length,w=matrix[0].length;
遍历的矩阵元素数量
int nums = 1;
//遍历条件 
while (x<=w&&y<=h){
//顺时针填充数据
}

 2. 遍历顶部第y行,由左向右

//up 遍历顶部第y行,由左向右
for (int i = x; i <w ; i++) {
    matrix[y][i]=nums;
    nums++;
}
 //第y行已经遍历过 
 y++;

 3. 遍历右边第w列,由上向下

 //right 遍历右边第w列,由上向下
for (int i = y; i <h ; i++) {
    matrix[i][w-1]=nums;
    nums++;
}
//第w列已经遍历过 
w--;

4.遍历底部h行, 由由向左

//down 遍历底部h行, 由由向左
for (int i = w-1; i >=x ; i--) {
    matrix[h-1][i]=nums;
    nums++;
}
//第h行已经遍历过 
h--;

 5. 遍历左边x行,由下向上

 //left 遍历左边x行,由下向上
for (int i = h-1; i >=y ; i--) {
    matrix[i][x]=nums;
     nums++;
}
//第x列已经遍历过 
 x++;

复杂度

  • 时间复杂度: O(n)

  • 空间复杂度: O(n)

Code

class Solution {
  public static int[][] generateMatrix(int n) {
        //初始化变量
        int[][] matrix = new int[n][n];
        int x=0,y=0,h=matrix.length,w=matrix[0].length;
         int nums = 1;
          //遍历条件 
          while (x<=w&&y<=h){
               //up 遍历顶部第y行,由左向右
              for (int i = x; i <w ; i++) {
                    matrix[y][i]=nums;
                    nums++;
              }
              //第y行已经遍历过 
              y++;
              //right 遍历右边第w列,由上向下
              for (int i = y; i <h ; i++) {
                    matrix[i][w-1]=nums;
                    nums++;
              }
             //第w列已经遍历过 
              w--;
              //down 遍历底部h行, 由由向左
              for (int i = w-1; i >=x ; i--) {
                      matrix[h-1][i]=nums;
                      nums++;
              }
            //第h行已经遍历过 
              h--;
              //left 遍历左边x行,由下向上
              for (int i = h-1; i >=y ; i--) {
                      matrix[i][x]=nums;
                      nums++;
              }
            //第x列已经遍历过 
              x++;
          }
        return matrix;
    }
}

执行效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值