输出螺旋矩阵

题目来源:

螺旋矩阵ii

思路参考carl哥的思路:

代码随想录

 

我的手撕代码:n为奇数包括了:n为偶数的回环。但是特有的是最后一个元素

    顺时针方向,左闭右开

class Solution {
    public int[][] generateMatrix(int n) {
        if(n == 1) {
            return new int[][] {{1}};
        }
        
        boolean under = true;
        boolean right = false;
        boolean down = false;
        boolean left = false;
        
        int[][] result = new int[n][n];
        
        int val = 1;
        int loopNum = 0;//定义第几个回环,从0开始
        
        while(val <= n*n) {
            if (n % 2 == 1 && val == n*n) {    //当n为奇数时,最后一个n*n值不能按照回环的方式放,应单独放置。
                result[(n / 2)][(n / 2)] = n*n;
                break;
            }
            if(under) {
                for(int i = loopNum; i < n - loopNum - 1; i++) {
                    result[loopNum][i] = val;
                    System.out.print("loopNum=" + loopNum + ",i="+i);
                    val++;
                }
                under = false;
                right = true;
                //show(result);
            }else if(right) {
                for(int i = loopNum; i < n - loopNum - 1; i++) {
                    result[i][n - loopNum - 1] = val;
                    val++;
                }
                right = false;
                down = true;
                //show(result);
            }else if(down) {
                for (int i = n - loopNum - 1; i > loopNum; i--) {
                    result[n - loopNum - 1][i] = val;
                    val++;
                }
                down = false;
                left = true;
                //show(result);
            }else if(left){
                for(int i = n - loopNum - 1; i > loopNum; i--) {
                    result[i][loopNum] = val;
                    val++;
                }
                left = false;
                under = true;
                loopNum++;
                //show(result);
            }
        }
        return result;
    }
    
    public static void show(int[][] nums) {
        for (int i = 0; i < nums[0].length; i++) {
            for (int j : nums[i]) {
                System.out.print(j + " ");
            }
            System.out.println();
        }
        System.out.println("#######################################");
    }
}

执行结果:通过

执行用时:10 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:36.2 MB, 在所有 Java 提交中击败了87.21%的用户

通过测试用例:20 / 20

carl哥实现代码(更简洁,更直接易懂):

class Solution {
    public int[][] generateMatrix(int n) {
     int[][] result = new int[n][n];
     
     //回环的个数(n为奇数时,最后的n*n构不成一个回环)
     int loop = n / 2;
     
     //每个回环的起始位置
     int startX = 0, startY = 0;
     
     //定义(a->b的)偏移量
     int offset = 1;
     
     //定义当前位置填充的值
     int val = 1;
     
     while(loop > 0) {
          int x = startX;
          int y = startY;
          
          //顺时针方向,左闭右开
          //上侧:从左到右
          for(; y < startY + n - offset; y++) {
               result[startX][y] = val;
               val++;
          }
          
          //右侧:从上到下
          for(; x < startX + n - offset; x++) {
               result[x][y] = val;
               val++;
          }
          
          //下侧:从右向左
          for(; y > startY; y--) {
               result[x][y] = val;
               val++;
          }
          
          //左侧:从下到上
          for(; x > startX; x--) {
               result[x][y] = val;
               val++;
          }
          
          loop--;
          
          startX++;
          startY++;
          
          offset += 2;
          
     }
     
     int mid = n / 2;
     if(n % 2 == 1) {
          result[mid][mid] = n * n;
     }
     
     return result;
    }
    
    public static void show(int[][] nums) {
     for (int i = 0; i < nums[0].length; i++) {
              for (int j : nums[i]) {
                   System.out.print(j + " ");
              }
              System.out.println();
          }
     System.out.println("#######################################");
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值