刷leetcode小菜鸟一枚,还在学习当中。
本道题按照自己的想法进行编写,感觉写的很笨拙。
大概思路:
(1)定义一个boolean访问矩阵,被访问到的矩阵进行对应位置boolean值
(2)将x,y先进行前后左右的移动,然后判断边界值以及该位置是否被访问过
/**
* @author pc
* @title: Test9
* @projectName day3
* @description: TODO
* @date 2021/4/2310:56
*/
public class Test9 {
public static void main(String[] args) {
int [][] matrix={{1,2,3},{4,5,6},{7,8,9}};
int[] arr = spiralOrder(matrix);
for (int i=0;i<arr.length;i++){
System.out.println(arr[i]);
}
}
public static int[] spiralOrder(int[][] matrix) {
if (matrix==null||matrix.length==0||matrix[0]==null||matrix[0].length==0){
return new int [0];
}
int[] arr = new int[matrix.length*matrix[0].length];
boolean[][] flag = new boolean[matrix.length][matrix[0].length];
int[][] directions = {{1,0},{-1,0},{0,1},{0,-1}};
int k = 0;
int x = 0;
int y = 0;
while(k<arr.length){
if(x==0){
for (;y<matrix[0].length;y++){
flag[0][y] = true;
arr[y] = matrix[0][y];
}
y = y-1;
k = y + 1;
}
for (int i=0;i<directions.length;i++){
int temx = x;
int temy = y;
x = x + directions[i][0];
y = y + directions[i][1];
while(x>=0&&x<matrix.length&&y>=0&&y<matrix[0].length&&!flag[x][y]){//是否满足边界值条件,访问完一行或者一列的值
flag[x][y]=true;
arr[k] = matrix[x][y];
k++;
x = x + directions[i][0];
y = y + directions[i][1];
}
x = x - directions[i][0];
y = y - directions[i][1];
if(x!=temx||y!=temy){
break;
}
}
}
return arr;
}
}