题目原型:
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 ArrayList<Integer> spiralOrder(int[][] matrix)
{
ArrayList<Integer> list = new ArrayList<Integer>();
if (matrix == null || matrix.length == 0)
return list;
int layer = 0;// 围成的层数
int row = 0;
int column = 0;
int lenRow = matrix.length;
int lenCol = matrix[0].length;
int min = lenRow < lenCol ? lenRow : lenCol;
//单独处理行或列为1的情况
if(min==1)
{
if(lenCol==1)
{
for(int index = 0;index<lenRow;index++)
list.add(matrix[index][lenCol-1]);
}
else
for(int index = 0;index<lenCol;index++)
list.add(matrix[lenRow-1][index]);
return list;
}
while (true)
{
while (column < lenCol - layer)
{
list.add(matrix[row][column]);
column++;
}
column--;// 退回来
row++;// 开始
while (row < lenRow - layer)
{
list.add(matrix[row][column]);
row++;
}
row--;
column--;
while (column >= layer)
{
list.add(matrix[row][column]);
column--;
}
column++;
row--;
layer++;// 将圈数加一
while (row >= layer)
{
list.add(matrix[row][column]);
row--;
}
if (layer >= min / 2)
break;
// 重新分配起点
row = layer;
column = layer;
}
// 处理最后一圈
if (lenRow % 2 == 0 && lenCol % 2 != 0)
{
column = lenCol / 2;
for (int index = layer; index < lenRow - layer; index++)
{
list.add(matrix[index][column]);
}
}
if (lenRow % 2 != 0 && lenCol % 2 == 0)
{
row = lenRow / 2;
for (int index = layer; index < lenCol - layer; index++)
{
list.add(matrix[row][index]);
}
}
if (lenRow % 2 != 0 && lenCol % 2 != 0)
{
if (lenRow < lenCol)
{
row = lenRow / 2;
for (int index = layer; index < lenCol - layer; index++)
{
list.add(matrix[row][index]);
}
}
else
{
column = lenCol / 2;
for (int index = layer; index < lenRow - layer; index++)
{
list.add(matrix[index][column]);
}
}
}
return list;
}