题目:54螺旋矩阵
给你一个 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]
题解
public static List<Integer> spiralOrder(int[][] matrix) {
/***
规律:模拟法
搞一个哨兵,在数组外包一层10000,i j从1开始 到len结束
4个for循环,终止条件是变10000,ij的变化是
j++;
i++;
j--;
i--;
*/
List<Integer> list = new ArrayList<>();
int[][] matrix2 = new int[matrix.length+2][matrix[0].length+2];
for (int i = 0; i < matrix2.length; i++) {
for (int j = 0; j < matrix2[0].length; j++) {
matrix2[i][j]=10000;
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
matrix2[i+1][j+1] = matrix[i][j];
}}
/*for (int i = 0; i < matrix2.length; i++) {//设置外圈一个哨兵 i j从1开始,碰到0结束
System.out.println(Arrays.toString(matrix2[i]));
}*/
int i=1;
int j=1;
int times1 = matrix.length;
int times2 = matrix[0].length;
int times = Math.min(times1,times2);
times = (times1+1)/2;
while (times>0){
//四个for循环 j++ i++ j-- i-- 终止条件是0
while (matrix2[i][j]!=10000){
//System.out.println(matrix2[i][j]);
list.add(matrix2[i][j]);
matrix2[i][j]=10000;
j++;
}
j--;
i++;
while (matrix2[i][j]!=10000){
//System.out.println(matrix2[i][j]);
list.add(matrix2[i][j]);
matrix2[i][j]=10000;
i++;
}
i--;
j--;
while (matrix2[i][j]!=10000){
//System.out.println(matrix2[i][j]);
list.add(matrix2[i][j]);
matrix2[i][j]=10000;
j--;
}
j++;
i--;
while (matrix2[i][j]!=10000){
//System.out.println(matrix2[i][j]);
list.add(matrix2[i][j]);
matrix2[i][j]=10000;
i--;
}
i++;
j++;
//times--;
if (matrix2[i][j]==10000){
break;
}
}
return list;
}
public static void main(String[] args) {
System.out.println(spiralOrder(new int[][]{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}));
System.out.println(spiralOrder(new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12}}));
System.out.println(spiralOrder(new int[][]{{2,5},{8,4},{0,-1}}));
}