给你一个
m
行n
列的矩阵matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素
一看到这个大家有没有想到
就是一个螺旋形状,那这道题我们应该怎么解决?
我们先来仔细的看,它这种螺旋形状的遍历是先【右-下-左-上】,所以我们可以先设置4个变量,去控制我们所需要遍历形状的边界
int m=matrix.length;
int n=matrix[0].length;
//上下左右进行遍历
int up=0;
int down=m-1;
int left=0;
int right=n-1;
那么循环结束的条件的是什么呢?
我们是要将目标数组中的元素按照螺旋的规则加入一个list集合中,那么循环的条件是不是就是我们集合list中的元素小于目标数组中的元素时就可以执行遍历,上文易得数组中每一个小数组的长度为n,数组中的有m个小数组,数组中的元素我们是不是可以用数组的个数*每个数组的长度
while(list.size()<m*n){
}
先进行上层的从左向右遍历:
//将上层的元素从左往右开始遍历
//遍历的条件是最上层不能大于最下层
if(up<=down){
//从左向右
for(int i=left;i<=right;i++){
list.add(matrix[up][i]);
}
//上边界下移
up++;
}
再从最后一列从上往下遍历
//将最后一列的元素从上往下开始遍历
if(left<=right){
//从上到下
for(int i=up;i<=down;i++){
list.add(matrix[i][right]);
}
//往左移一列
right--;
}
最后一层从右往左遍历
//将最后一行从右往左遍历
if(up<=down){
for(int i=right;i>=left;i--){
list.add(matrix[down][i]);
}
down--;
}
第一列从下自上遍历
//将第一列进行从小往上进行遍历
if(left<=right){
for(int i=down;i>=up;i--){
list.add(matrix[i][left]);
}
left++;
}