剑指Offer_19_顺时针打印矩阵
题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
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
.
解题思路
每次打印一圈。每次的起始位置满足(start,start),且 start * 2 要小于行数和列数。
每次打印从矩形的上边开始(在存在一圈的情况下),顺时针打印。
首先打印上边,打印完成,判断结束行是否大于start,如果大于,那么打印右边;然后判断结束列是否大于start且结束行是否大于start,如果满足,则打印下边;最后如果存在多列且行数至少有三行,则打印左边。
实现
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<>();
if (matrix == null || matrix.length <= 0 || matrix[0].length <= 0) return list;
int start = 0;
int rows = matrix.length;
int cols = matrix[0].length;
while (rows > start * 2 && cols > start * 2){
print(matrix,cols,rows,start,list);
start ++;
}
return list;
}
private void print(int[][] matrix, int cols, int rows, int start, ArrayList<Integer> list) {
int endRows = rows - start - 1;
int endCols = cols - start - 1;
//打印上边
for (int i = start; i < cols - start; i++){
list.add(matrix[start][i]);
}
//存在多行,打印右边
if (endRows > start){
int j = endCols;
for (int i = start + 1; i < rows - start; i ++){
list.add(matrix[i][j]);
}
}
//存在多行且有多列,打印下边
if (endRows > start && endCols > start){
int rIndex = endRows;
for (int i = cols - start - 2; i >= start; i--){
list.add(matrix[rIndex][i]);
}
}
//存在三行以上且有多列,打印下边
if (endRows > start + 1 && endCols > start){
for (int i = rows - start - 2; i > start; i--){
list.add(matrix[i][start]);
}
}
}
}