给你一个m行n列的矩阵,以螺旋形的顺序输出矩阵中所有的元素。
1. 常规思路(超时)
按照螺旋形的方向不断的搜索元素,直到遍历完所有的元素。
public List<Integer> spiralOrder(int[][] matrix)
{
List<Integer> list = new ArrayList<>();
int m = matrix.length; // 行数
int n = matrix[0].length; // 列数
int i, j;
int rowStart = 0; // 从前向后数
int rowEnd = 0; // 从后向前数
int colStart = 0; // 从左向右数
int colEnd = 0; // 从右向左数
int ncount = 0;
while (true)
{
// 从左到右
for (j=colStart; j<n-colEnd; j++)
{
list.add(matrix[rowStart][j]);
ncount++;
}
rowStart++;
// 从上到下
for (i=rowStart; i<m-rowEnd; i++ )
{
list.add(matrix[i][j-1]);
ncount++;
}
colEnd++;
// 从右到左
for (j=n-colEnd-1; j>=colStart; j--)
{
list.add(matrix[i-1][j]);
ncount++;
}
rowEnd++;
// 从下到上
for (i=m-rowEnd-1; i>=rowStart; i--)
{
list.add(matrix[i][j+1]);
ncount++;
}
colStart++;
if (ncount == m*n)
{
break;
}
}
return list;
}
优化后:
public List<Integer> spiralOrder(int[][] matrix)
{
List<Integer> list = new ArrayList<>();
// 先对矩阵的情况进行判断
if (matrix == null || matrix.length == 0)
{
return list;
}
int rowBegin=0;
int rowEnd=matrix.length-1;
int colBegin=0;
int colEnd=matrix[0].length-1;
while(rowBegin<=rowEnd &&colBegin<=colEnd){
for(int i=colBegin;i<=colEnd;i++){
list.add(matrix[rowBegin][i]);
}
rowBegin++;
for (int i=rowBegin;i<=rowEnd;i++){
list.add(matrix[i][colEnd]);
}
colEnd--;
//case colums greater than rows
if(rowBegin<=rowEnd){
for(int i=colEnd;i>=colBegin;i--){
list.add(matrix[rowEnd][i]);
}
}
rowEnd--;
//case colums less than rows
if(colBegin<=colEnd){
for(int i=rowEnd;i>=rowBegin;i--){
list.add(matrix[i][colBegin]);
}
}
colBegin++;
}
return list;
}