题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
思路:
1.确认是否为只有一行或一列的特殊情况
2.顺时针将圈一个个剥离,一个圈即一个矩形,如下图,橙色为第一圈,蓝色为第二圈
3.由图可知,第一圈的范围(蓝色),由[ startRow ][ startCol ] (即[0][0])到[ endRow ][ endCol ]确定
先向右走,从startcol ~ endCol,即第一行
再向下走,因为第一个元素4已记录过,所以从startRow+1开始走, 到 endRow结束,即最后一列
再向左走,因为第一个元素2已记录过,所以从endCol-1开始走,到startCol结束,即最后一行
再向上走,因为第一个元素5已记录过,最后一个元素1也已记录过,所以从endRow-1到startRow+1
至此一圈结束
4.由图可以看出下一圈的范围由[ startRow+1 ][ startCol+1 ] (即[1][1])到[ endRow-1 ][ endCol-1 ]确定,重复上述过程直到startRow > endRow 或 startCol > endCol
实现:
*通过简单循坏即可完成,注意去掉重复元素就行
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int row = matrix.length;
if(row==0)
return null;
int col = matrix[0].length;
if(col==0)
return null;
ArrayList<Integer> list = new ArrayList<Integer>(); //新建动态数组存储结果
int startRow = 0;
int endRow = row-1;
int startCol = 0;
int endCol = col-1;
while(startRow<=endRow&&startCol<=endCol){
if(startRow==endRow){ //只有一行
for(int i=startCol;i<=endCol;i++)
list.add(matrix[startRow][i]);
return list;
}
if(startCol==endCol){ //只有一列
for(int i=startRow;i<=endRow;i++)
list.add(matrix[i][startCol]);
return list;
}
for(int i=startCol;i<=endCol;i++) //向右
list.add(matrix[startRow][i]);
for(int i=startRow+1;i<=endRow;i++) //向下,注意去掉第一个元素
list.add(matrix[i][endCol]);
for(int i=endCol-1;i>=startCol;i--) //向左,注意去掉第一个元素
list.add(matrix[endRow][i]);
for(int i=endRow-1;i>=startRow+1;i--) //向下,注意去掉第一个和最后一个元素
list.add(matrix[i][startCol]);
startRow = startRow + 1; //确定下一圈的范围
startCol = startCol + 1;
endRow = endRow - 1;
endCol = endCol - 1;
}
return list;
}
}