没懂二维数组循环操作的进

什么是二维数组:

java中 二位数组的定义: int[ ][ ]   nums=new int[行数i][列数j ];

 

       这里的行数和列数很容易被搞混,行数就是图中的i定位的是第几行(竖着的),列数就是图中的j定位第几列(横着的),  故此 num[1][2]   就表示第1横行,第二竖列。

 怎么个循环(顺时针,由外向内操作)操作二维数组?

  1. 既然它是二维数组那么他就有四个方向,分别是top、bottom、left、right。
  2. 确定四个方向的初始值。top=0;bottom=i-1;left=0;right=j-1;(数据类型都是整型的)
  3. 顾名思义,顺时针,由外向里一圈一圈的操作。按照数字从1到9的顺序。
  4. 类似图片中图片:

 由上图,我们不难想出,只要我们根据这个思路控制好下标的走向既可以完成循环操作二维数组。

上例题:

力扣连接:

https://leetcode-cn.com/problems/spiral-matrix-ii/

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

示例 1:

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

 第一种解法:具体思路代码中写的很详细;

class Solution {
    public int[][] generateMatrix(int n) {
      int[][] res=new int[n][n];
      //循环次数;
      int loop=n/2;
      //定义每次循环的起始位置;
      int starX=0;
      int starY=0;
      //定义偏移量;
      int offset=1;
      //定义填充数字;
      int count=1;
      //定义中间的位置;
      int mid=n/2;
      while(loop>0){
          int i=starX;
          int j=starY;
          //模拟从上测 从左到右;
          for(; j<starY+n-offset;j++){
              res[starX][j]=count++;
          }
          //模拟右侧从上到下
          for(;i<starX+n-offset;i++){
              res[i][j]=count++;
          }
          //模拟下册从又往左
          for(;j>starX;j--){
              res[i][j]=count++;
          }
          //模拟左侧从下到上;
          for(;i>starY;i--){
              res[i][j]=count++;
          }
          loop--;
          starX+=1;
          starY+=1;
          offset+=2;
      }
      if(n%2==1){
          res[mid][mid]=count;
      }
      return res;
    }
}

 第二种解法:

class Solution {
    public int[][] generateMatrix(int n) {
      int[][] res=new int[n][n];
      int top=0;
      int bottom=n-1;
      int left=0;
      int right=n-1;
      int count=1;
      while(left<=right && top<=bottom){
          //从左开始一直往右循环如数count一直到顶头
          for(int i=left;i<=right;i++){
              res[top][i]=count++;
          }
          //从第二行的最右边开始往下循环输入count一直到顶头
          for(int i=top+1;i<=bottom;i++){
              res[i][right]=count++;
          }
          //这个时候需要注意往内圈循环了,所以left和top不能循环到顶头了
          if(left<right && top<bottom){
              for(int i=right-1;i>left;i--){
                  res[bottom][i]=count++;
              }
              for(int i=bottom;i>top;i--){
                  res[i][left]=count++;
              }
          }
          top++;
          bottom--;
          left++;
          right--;
      }
      return res;
    }
}

马上熄灯了,今天就到这里了。拜了个拜!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值