题目描述:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
思路:这道题在算法上没有难度,关键在于设计一种逻辑容易理解,代码易于实现的转圈遍历方式,矩阵分圈处理能够解决很多其它的面试题。在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵,可以把打印一圈分为四步,第一部从左到右打印一行,第二步从上向下打印一列,第三步从右到左打印一行,第四部从下向上打印一列,不过要注意最后一圈可能是只有一行,只有一列或只有一个数字,这些要在代码中考虑到。
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
if(matrix == null || matrix.length == 0){
return null;
}
ArrayList<Integer> result = new ArrayList<Integer>();
printMatrixClock(matrix, 0, 0, matrix.length - 1, matrix[0].length - 1, result);
return result;
}
public void printMatrixClock(int[][] matrix,int startRow,int startCol,int endRow,
int endCol,ArrayList<Integer> result){
if(startRow<endRow && startCol<endCol){
for(int j = startCol;j<=endCol;j++){
result.add(matrix[startRow][j]);
}
for(int i = startRow+1;i<=endRow-1;i++){
result.add(matrix[i][endCol]);
}
for(int j = endCol;j>=startCol;j--){
result.add(matrix[endRow][j]);
}
for(int i=endRow-1; i>=startRow+1; i--) {
result.add(matrix[i][startCol]);
}
printMatrixClock(matrix, startRow + 1, startCol + 1, endRow - 1, endCol - 1, result) ;
}else if(startRow==endRow && startCol<endCol) {
for(int j=startCol; j<=endCol; j++) {
result.add(matrix[startRow][j]);
}
}else if(startRow<endRow && startCol==endCol) {
for(int i=startRow; i<=endRow; i++) {
result.add(matrix[i][endCol]);
}
}else if(startRow==endRow && startCol==endCol) {
result.add(matrix[startRow][startCol]) ;
}else {
return ;
}
}
}