19 剑指offer--数组--顺时针打印矩阵
顺时针打印矩阵
题目
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
则依次打印出数组:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。
思路
将结果存入vector数组,从左到右,再从上到下,再从右到左,最后从下到上遍历。
代码
public class Test2 {
public static void main(String[] args) {
int[][] matrix ={
{1,2,3},{4,5,6},{7,8,9}};
System.out.println(spiralOrder(matrix));
}
public static ArrayList<Integer> spiralOrder(int [][] matrix){
ArrayList<Integer> list = new ArrayList<Integer>();
int topRow = 0;
int topCol = 0;
int downRow = matrix.length - 1;
int downCol = matrix[0].length - 1;
while (topRow <= downRow && topCol <= downCol) {
//当满足左上角的小于等于右下角就可以循环
printCircle(list, matrix, topRow++, topCol++, downRow--, downCol--);
}
return list;
}
public static void printCircle(ArrayList<Integer> list, int [][] matrix, int topRow, int topCol, int downRow, int downCol) {
if (topRow == downRow) {
//子矩阵只有一行的时候
for (int i = topCol; i <= downCol; i++) {
//注意循环开始的条件,是从这一列开始,不是从零
list.add(matrix[topRow][i]);
}
}
else if (topCol == downCol) {
//子矩阵只有一列的时候
for (int i = topRow; i <= downRow; i++) {
list.add(matrix[i][topCol]);
}
}
else { //其他的情况下
int currentRow = topRow;
int currentCol = topCol;
while (currentCol != downCol) {
//左到右 本行最后一个不访问,在下个循环里面。如图
list.add(matrix[topRow][currentCol]);
currentCol++;
}
while (currentRow != downRow) {
//上到下0
list.add(matrix[currentRow][downCol]);
currentRow++;
}
while (currentCol != topCol) {
//右到左
list.add(matrix[downRow][currentCol]);
currentCol--;
}
while (currentRow != topRow) {
//下到上
list.add(matrix[currentRow][topCol]);
currentRow--;
}
}
}
}