什么是二维数组:
java中 二位数组的定义: int[ ][ ] nums=new int[行数i][列数j ];
这里的行数和列数很容易被搞混,行数就是图中的i定位的是第几行(竖着的),列数就是图中的j定位第几列(横着的), 故此 num[1][2] 就表示第1横行,第二竖列。
怎么个循环(顺时针,由外向内操作)操作二维数组?
- 既然它是二维数组那么他就有四个方向,分别是top、bottom、left、right。
- 确定四个方向的初始值。top=0;bottom=i-1;left=0;right=j-1;(数据类型都是整型的)
- 顾名思义,顺时针,由外向里一圈一圈的操作。按照数字从1到9的顺序。
- 类似图片中图片:
由上图,我们不难想出,只要我们根据这个思路控制好下标的走向既可以完成循环操作二维数组。
上例题:
力扣连接:
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;
}
}
马上熄灯了,今天就到这里了。拜了个拜!!!