http://blog.51cto.com/acevi/2141009
题目如下
分析
不难发现,按照顺时针螺旋顺序遍历矩阵其实就只有四个方向:顶层行从左往右;右边列从上到下;底层行从右往左;左边列从下往上。遍历完这四个方向之后就表示已经遍历完了一圈,下一圈也同样是这四个方向,只是初始位置和结束位置会在每一轮遍历之后发生变化。
下面介绍两种方法,思想基本一致,不同之处是对边界的判断和位置的移动。
方法一
public class SpiralMatrix {
public static List<Integer> spiralMatrixOlder(int[][] matrix) {
List<Integer> res = new ArrayList<Integer>();
if(matrix.length == 0)
return res;
int rowBegin = 0;
int colBegin = 0;
int rowEnd = matrix.length - 1; //行
int colEnd = matrix[0].length - 1; //列
/*
* Time Complexity: O(N)
* Space Complexity:O(N)*/
while(rowBegin <= rowEnd && colBegin <= colEnd){
//底层行从左往右
for(int i = colBegin;i <= colEnd;i++) {
res.add(matrix[rowBegin][i]);
}
rowBegin++; //处理完一行后往下移一行
//右边列从上往下
for(int i = rowBegin ;i <= rowEnd;i++) {
res.add(matrix[i][colEnd]);
}
colEnd--; //处理完一列往前移一列
//底层行从右往左
if(rowBegin <= rowEnd) {
for(int j = colEnd;j>=colBegin;j--){
res.add(matrix[rowEnd][j]);
}
rowEnd--;
}
//左边列从下往上
if(colBegin <= colEnd) {
for(int j = rowEnd;j >= rowBegin ; j--) {
res.add(matrix[j][colBegin]);
}
colBegin++;
}
}
return res;
}
类似的:
public class Solution
{
public int[][] generateMatrix(int n)
{
int[][] res = new int[n][n];
int total = n*n;
int num = 1;
int rowBegin = 0;
int rowEnd = n-1;
int colBegin = 0;
int colEnd = n-1;
while(num <= total)
{
// traverse right (y changes)
for(int y=colBegin; y<=colEnd; y++)
res[rowBegin][y] = num++;
rowBegin++; // move down one row
// traverse down (x changes)
for(int x=rowBegin; x<=rowEnd; x++)
res[x][colEnd] = num++;
colEnd--; // move left one column
// traverse left (y changes)
for(int y=colEnd; y>=colBegin; y--)
res[rowEnd][y] = num++;
rowEnd--; // move up one row
// traverse up (x changes)
for(int x=rowEnd; x>=rowBegin; x--)
res[x][colBegin] = num++;
colBegin++; // move right one column
}
return res;
}
}