题目:Spiral Matrix
难度:medium
问题描述:
Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.
For example,
Given the following matrix:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
You should return [1,2,3,6,9,8,7,4,5]
.
解题思路:将问题分成了两个子问题,一是将数组的“表皮”绕一圈,读值并加入链表。二是将数组的表皮剥去。循环操作一二即可。
具体代码如下:
public class m_54_SpiralMatrix {
public static List<Integer> spiralOrder(int[][] matrix) {
ArrayList<Integer> list=new ArrayList<>();
if(matrix==null||matrix.length==0){
return list;
}
while(true){
onecircle(matrix,list);
matrix=boke(matrix);
// System.out.println("------");
// show(matrix);
if(matrix==null){
break;
}
}
return list;
}
public static void onecircle(int[][] matrix,List<Integer> list){
if(matrix==null) return;
int row=matrix.length;
int col=matrix[0].length;
int i;
if(row==1&&col==1){
// System.out.println(matrix[0][0]);
list.add(matrix[0][0]);
return;
}else if(row==1){
for(i=0;i<col;i++){
// System.out.println(matrix[0][i]);
list.add(matrix[0][i]);
}
return;
}else if(col==1){
for(i=0;i<row;i++){
// System.out.println(matrix[i][0]);
list.add(matrix[i][0]);
}
return;
}
for(i=0;i<col-1;i++){
// System.out.println(matrix[0][i]);
list.add(matrix[0][i]);
}
for(i=0;i<row-1;i++){
// System.out.println(matrix[i][col-1]);
list.add(matrix[i][col-1]);
}
for(i=col-1;i>0;i--){
// System.out.println(matrix[row-1][i]);
list.add(matrix[row-1][i]);
}
for(i=row-1;i>0;i--){
// System.out.println(matrix[i][0]);
list.add(matrix[i][0]);
}
}
public static int[][] boke(int[][] matirx){
if(matirx==null) return null;
int row=matirx.length;
int col=matirx[0].length;
if(row<3||col<3){
return null;
}
int[][] res=new int[row-2][col-2];
for(int i=1;i<row-1;i++){
for(int j=1;j<col-1;j++){
res[i-1][j-1]=matirx[i][j];
}
}
return res;
}
public static void show(int[][] b){
if(b==null){
System.out.print("空");
return;
}
for(int i=0;i<b.length;i++){
for(int j=0;j<b.length;j++){
System.out.print(b[i][j]+" ");
}
System.out.println();
}
}
public static void main(String[]args){
int[][] m=new int[2][3];
int r=1;
for(int i=0;i<2;i++){
for(int j=0;j<3;j++){
m[i][j]=r++;
}
}
List<Integer> list=spiralOrder(m);
for(int w:list){
System.out.println(w);
}
}
}