题目:
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]
.
就是给定一个m * n的矩阵,然后按照顺时针的顺序依次把所有矩阵中的元素都输入到一个list中。此题,我想到的是采用一个方法,然后这个方法是按照顺时针的顺序来输入数字,并且每次调用这个方法即可。
public List<Integer> spiralOrder(int[][] matrix)
{
List<Integer> list = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0 || matrix[0].length == 0)
return list;
int rowlength = matrix.length;
int collength = matrix[0].length;
int length = rowlength > collength ? collength : rowlength; //选择长和宽中的比较小的那个
int leng = length / 2;
int i = 0;
for(i = 0; i <= leng; i++)
{
add(matrix,i,rowlength - i - 1,i,collength - 1 - i,list);
}
return list;
}
public void add(int[][] matrix,int rowstart,int rowend,int colstart,int colend,List<Integer> list)
{
if(rowstart > rowend || colstart > colend) //这个方法是用来按照从上到右边再到下边最后到左边的顺序来输入数字的方法
return;
if(rowstart == rowend && colstart == colend) //但要分好几种情况,比如如果只有一个元素了,那么就直接输入即可。
list.add(matrix[rowstart][colstart]);
else if(rowstart == rowend && colstart != colend) //比如只有一行
{
for(int i = colstart; i <= colend; i++)
{
list.add(matrix[rowstart][i]);
}
}
else if(rowstart != rowend && colstart == colend) //只有一列了
{
for(int j = rowstart; j <= rowend; j++)
{
list.add(matrix[j][colstart]);
}
}
//以下就是一整块的情况
else if(rowstart != rowend && colstart != colend)
{ /<span style="font-family: Arial, Helvetica, sans-serif;">/上边</span>
for(int i = colstart; i <= colend; i++)
{
list.add(matrix[rowstart][i]);
}
//右边
for(int j = rowstart + 1; j <= rowend; j++)
list.add(matrix[j][colend]);
//下边
for(int k = colend - 1; k >= colstart; k--)
{
list.add(matrix[rowend][k]);
}
//左边
for(int l = rowend - 1; l> rowstart; l--)
list.add(matrix[l][colstart]);
}
}