Spiral Matrix
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]
.
解题思路:
我个人的想法就是一圈一圈的遍历直到遍历结束。对于每一圈都有一个边界。
例如上面的例子。外面一圈是1 2 3 6 9 8 7 4。这行值为rindex,列值为cindex。初始的边界为side = 0
先遍历上面的一行,1 2 3,rindex保持0不变,cindex++,当cindex == 2(3-1-side)的时候,上面一行遍历结束 。
接下来就是遍历右边的一列,6 9,保持cindex不变,rindex++,当rindex == 2 (3-1-side)的时候,右边一列遍历结束 。
接下来就是遍历下面的一行, 8 7 ,保持rindex不变,cindex--,当cindex == 0(side)的时候,下面一行遍历结束。
最后遍历左边的一列,4,保持cindex不变,rindex--,当rindex == 1(side+1)的时候,左边一列遍历结束。
令side = side + 1。cindex++。开始里面一圈的遍历。不断循环直到结束。
public class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix == null || matrix.length == 0)
return new ArrayList<Integer>();
int row = matrix.length;
int col = matrix[0].length;
int rindex = 0;
int cindex = 0;
int side = 0;
List<Integer> result = new ArrayList<Integer>();
while(rindex>=side && rindex<row-side && cindex>=side && cindex<col-side)
{
result.add(matrix[rindex][cindex]);
if(rindex == side)
{
if(cindex == col-side-1)
rindex++;
else
cindex++;
}
else if(cindex == col-side-1)
{
if(rindex == row-side-1)
cindex--;
else
rindex++;
}
else if(rindex == row-side-1)
{
if(cindex == side)
{
if(rindex == side +1)
{
side++;
cindex++;
}
else
rindex--;
}
else
cindex--;
}
else if(cindex == side)
{
if(rindex == side +1)
{
side++;
cindex++;
}
else
rindex--;
}
}
return result;
}
}