题目描述
给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
例如,
给出以下矩阵:
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
你应该返回[1,2,3,6,9,8,7,4,5]。
- 分析
只想出了特殊的情况 (如矩阵为空)返回null的情况
没!思!路!(菜鸡的呐喊~)
看了题解,思路是:
设置上、下、左、右四个界限,分别对应 矩阵 的 行、列界限,根据题意螺旋遍历插入元素到ArrayList集合中
根据题意螺旋遍历 分为 4 个方向,行从左到右—>列从上到下—>行从右到左—>列从下到上
然后螺旋遍历的前面需要判断条件:是否左界限 越过 右界限,是否上界限 越过 下界限 。每次行、列遍历添加到list后界限值都会改变)
若越过,就证明已经完成螺旋
- 代码
import java.util.*;
public class Solution {
public ArrayList<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
//空矩阵
if(matrix.length == 0){
return list;
}
//空矩阵
else if(matrix[0].length == 0){
return list;
}
//设置下标界限
//行的下标界限
int up = 0;
int down = matrix.length - 1;
//列下标的界限
int left = 0;
int right = matrix[0].length - 1;
int i = 0;
while(true){
//完成结束的条件
if(left>right){
return list;
}
//还没有完成,从up行(开始是第0行)开始向list添加元素,一个循环结束,添加一行
//进行之后第up行的添加任务已经完成,上限行号界限下移,也就是要添加到list的元素范围圈变小了
for(int k = left;k<=right;k++){
list.add(matrix[up][k]);
}
up++;
//完成结束的条件
if(up>down){
return list;
}
//还没有完成,从第down列(开始是最后一列)开始像list添加,一个循环结束,天添加了一列
//进行完之后第right列的添加任务已经完成,右限列号界限左移
for(int k = up;k<= down;k++){
list.add(matrix[k][right]);
}
right--;
if(left>right){
return list;
}
//从第down行开始(开始是最后一行)从右向左添加,一个循环结束,添加了一行
//进行完第down行的添加任务已经完后,下限行号界限上移
for(int k = right;k>=left;k--){
list.add(matrix[down][k]);
}
down--;
if(up>down){
return list;
}
//从第left列开始(开始是第0列),向上添加,一个循环结束,添加了一列
//进行完第left的添加任务已经完成,左限列号界限右移
for(int k = down;k>= up;k--){
list.add(matrix[k][left]);
}
left++;
}
}
}
而且需要注意
给定一个矩阵,如何获取行、列的数量,假定a是二维数组矩阵
a.length
----》
行的数目
a[0].length
-----》
列的书目
拓展
这里我想到c#
定义二维数组的方式,c#
定义二维数组的方式和Java和C不太相同
c#中有交差数组的概念(就是数组嵌套数组)
如果像Java那样定义数组int [] [] arr = new int [2] [ 3]
就是不规则的交差数组
而规则的定义方法是int [ , ] arr = new int [ 2, 3];