题目:
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]
.
题意:
给定一个 m x n大小的矩阵(m行,n列),以螺旋顺序返回所有的元素。
比如,
给定矩阵
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]你应该返回
[1,2,3,6,9,8,7,4,5]
.
算法分析:
根据题意很容易写出代码
但是看似简单,边界情况需要考虑清楚
AC代码:
public class Solution
{
public ArrayList<Integer> spiralOrder(int[][] matrix)
{
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix==null||matrix.length==0)
return list;
int h=matrix.length;
int l=matrix[0].length;
if(matrix.length==1)
{
for(int i=0;i<matrix[0].length;i++)
list.add(matrix[0][i]);
return list;
}
if(matrix[0].length==1)
{
for(int i=0;i<matrix.length;i++)
list.add(matrix[i][0]);
return list;
}
int startrow=0;
int endrow=h-1;
int startcol=0;
int endcol=l-1;
while(startrow<=endrow&&startcol<=endcol)
{
if(startrow==endrow&&startcol==endcol&&matrix.length==matrix[0].length)//剩余一个中间元素时
list.add(matrix[startrow][startcol]);
else if(startrow==endrow&&startcol!=endcol)//剩余中间一行元素时
{
for(int j=startcol;j<=endcol;j++)
list.add(matrix[startrow][j]);
}
else if(startrow!=endrow&&startcol==endcol)//剩余中间一列元素时
{
for(int i=startrow;i<=endrow;i++)
list.add(matrix[i][startcol]);
}
else//正常转
{
for(int j=startcol;j<endcol;j++)
list.add(matrix[startrow][j]);
for(int i=startrow;i<endrow;i++)
list.add(matrix[i][endcol]);
for(int j=endcol;j>=startcol+1;j--)
list.add(matrix[endrow][j]);
for(int i=endrow;i>=startrow+1;i--)
list.add(matrix[i][startcol]);
}
startrow++;
endrow--;
startcol++;
endcol--;
}
return list;
}
}