题目描述:
给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100
题解:
之前大一小学期做过类似的题,依稀记得需要很多的判断是否拐弯和拐弯之后要怎么操作的数组变量,于是试着写了一下,其实不难,但是需要找到规律,在第一圈的右下左上的时候有点特殊,就是左之后就需要进行stepx--和stepy--了,stepx和stepy是指示在x轴和y轴的该次移动需要总共走过多少步,比如示例2的1->2->3->4的这次移动的stepy就是3,4->8->12这次移动的stepx就是2,在走到9之后,就需要更新stepx和stepy了,将其自减。而在其他圈的循环过程中,每两次转弯进行一次stepx--和stepy--即可。规律不难找,可以自己画画试一下。
判断循环结束的条件就使用现在遍历输出到list中的数据大小和数组大小相同作为结束变脸的条件。
击败了1.2%的用户,不过这坨代码终究是过了。
代码实现:
class Solution {public List<Integer> spiralOrder(int[][] matrix) {
//控制方向:右下左上int[][] derection = new int[][]{{0,1},{1,0},{0,-1},{-1,0}};//初始化y轴方向的行走距离int stepy = matrix[0].length-1; //3//初始化x轴方向的行走距离int stepx = matrix.length-1;// 2(实际在“左”之后就要更新--)int cur = 0;//记录当前的行走方向 0-右 1-下 2-左 3-上//设置一个记录现在走了多少步的countint count = 1;//记录现在遍历到的数组元素List<Integer> list = new ArrayList<>();list.add(matrix[0][0]);int startx =0;int starty = 0;int posx = 0;int posy =0;int size = matrix.length*matrix[0].length;//记录圈数int r = 1;//记录现在拐了几次int c = 0;//System.out.println("数组的大小:"+size);while(count!=size){for(cur = 0;cur<=3;cur++){//向右走if(cur==0){for (int i = 0; i < stepy; i++) {posx+=derection[0][0];posy+=derection[0][1];list.add(matrix[posx][posy]);++count;System.out.println(count);if(count==size){break;}}}//向下走else if(cur == 1){for (int i = 0; i < stepx; i++) {posx+=derection[1][0];posy+=derection[1][1];list.add(matrix[posx][posy]);++count;if(count==size){break;}}}//向左走else if(cur==2) {for (int i = 0; i < stepy; i++) {posx += derection[2][0];posy += derection[2][1];list.add(matrix[posx][posy]);++count;if(count==size){break;}}//向左走完之后需要更新stepx和stepyif(r==1) {stepx -= 1;stepy -= 1;c=-1;System.out.println("现在该位置完成第三次拐弯,并且将stepx/y-1,c置0 "+stepx+" "+stepy+" "+c);}}//向上走else{for (int i = 0; i < stepx; i++) {posx += derection[3][0];posy += derection[3][1];list.add(matrix[posx][posy]);++count;if(count==size){break;}}}c++;if(c==2&&r!=1){stepx--;stepy--;c=0;}if(count==size){break;}}System.out.println(r+"圈的stepx和stepy等于:"+stepx+" "+stepy);r++;// System.out.println("第一圈走完了,现在的count = "+count);}return list;}
}