给定一个包含m×n个元素的矩阵,请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例1: 输入: [ [ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9] ] 输出:[1,2,3,6,9,8,7,4,5]
示例2: 输入: [ [ 1, 2, 3, 4], [ 5, 6, 7, 8], [ 9,10,11,12] ]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
- 思路
先求出环数,min(m,n)/2,剩下的注意循环角标即可。
import java.util.ArrayList;
import java.util.List;
public class Matrix {
public static List<Integer> spitalOrder(int[][] matrix){
List<Integer> res = new ArrayList<>();
if(matrix ==null || matrix[0].length ==0)
return res;
int numi = matrix.length;
int numj = matrix[0].length;
int loop = numi > numj ? (numj+1)/2 : (numi+1)/2;
for(int i=0; i<loop; i++,numi-=2,numj-=2) {
for(int col=i; col<i+numj; col++)
res.add(matrix[i][col]);
for(int row=i+1; row<i+numi; row++)
res.add(matrix[row][i+numj-1]);
if(numi==1 || numj==1)
break;
for(int col=i+numj-2; col>=i; col--)
res.add(matrix[i+numi-1][col]);
for(int row=i+numi-2; row>i; row--)
res.add(matrix[row][i]);
}
return res;
}
public static void main(String[] args) {
int[][] a = new int[3][3];
for(int i=0;i<3;i++)
for(int j=0; j<3;j++)
a[i][j] = i+j;
System.out.println(Matrix.spitalOrder(a));// TODO 自动生成的方法存根
}
}