剑指OfferJZ3219:顺时针打印矩阵-java版
JZ19:则依次打印出数字
- JZ19:则依次打印出数字
[1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10] 示例1 输入: [[1,2,3],[4,5,6],[7,8,9]] 返回值: [1,2,4,3]
我们可以把二维数组的每一层拆解为上下左右四条边,既然题目要求顺时针遍历,我们对边的访问顺序就应该是:上,右,下,左,也即是往右,往下,往左,往上 我们可以用flag变量来标记当前遍历矩阵的方向:
1:往右,2:往下,3:往左,4:往上
二维数组matrix的行数x为:matrix.length 列数y为:matrix[0].length
如图,
- 我们一开始往右走(y增加),此时flag=1,经过1->2->3->#,走到3以后的位置时越界(y=4),即超过了数组的列数y,更改flag=2,并消除数组越界y–,最后转向x++
-
接着往下走(x增加)此时flag=2,经过6->9->#,走到9以后的位置越界(x=4),即超过了数组的行数x,更改flag=3,并消除数组越界x–,最后转向y–
-
接着往左走(y减小)此时flag=3,经过8->7->#,走到7以后的位置越界(y=-1),即超过了数组的列数y,更改flag=4,并消除数组越界y++,最后转向x–
-
接着往上走(x减小)此时flag=4,经过4->1,走到1的位置发现1已经被遍历过了,也属于越界,那么我们将x增加回到4的位置,再将y增加转向到5的位置
到这里整个二维数组就走完了!
补充:
- :走到遍历过的数也属于越界
- :按以上步骤每走过没有越界的位置的数就把它存储到数组中,我这里是ans数组)
public class jz19{
public ArrayList printMatrix(int [][] matrix) {
ArrayList ans=new ArrayList();
int flag=1;//flag标记当前矩阵遍历的方向 1->往右,2->往下,3->往左,4->往上
int x=0;//矩阵的下标
int y=0;
boolean[][] vis=new boolean[matrix.length][matrix[0].length];//vis数组用来标记已经走过的点//matrix.length表示行数x,matrix[0].length表示列数y
while (ans.size()
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?