[劍指offer]順時針列印矩陣
阿新 • • 發佈:2018-12-01
調了兩三小時,從通過11%的案例,到60%,再到80%,再到100%
輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,
例如,如果輸入如下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.
我的思路就是把矩陣看成一圈一圈的,而順時針列印就是從最外圈到最裡圈一圈一圈遍歷
同時一個圈由四個變數決定:行開始的地方,行結束的地方,列開始的地方和列結束的地方
所以只需控制好這四個變數,注意邊界,問題就不難了
同時,需要考慮的特殊情況就是一行的矩陣和一列的矩陣,還有最裡圈的只有一行,和只有一個數字的情況
這些都考慮到問題就解決了
import java.util.ArrayList; public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { int rowEnd = matrix.length-1;//行 int columnEnd = matrix[0].length-1;//列 int columnStart = 0; int rowStart = 0; ArrayList<Integer> res = new ArrayList<>(); //特殊情況,只有一行 if (matrix.length==1){ for (int i = 0;i < matrix[0].length;i++){ res.add(matrix[0][i]); } return res; } //特殊情況,只有一列 if (matrix[0].length==1){ for (int i = 0;i < matrix.length;i++){ res.add(matrix[i][0]); } return res; } //把矩形看做一圈一圈的,一圈一圈列印,控制好邊界 while (true){ if (columnEnd<columnStart||rowStart>rowEnd){ break; } res.addAll(printIn(matrix,rowStart,rowEnd,columnStart,columnEnd)); rowStart+=1; columnStart+=1; rowEnd-=1; columnEnd-=1; } return res; } //全部常量均為下標,即從0開始 public ArrayList<Integer> printIn(int[][] matrix,int rowStart,int rowEnd,int columnStart,int columnEnd){ ArrayList<Integer> list = new ArrayList<>(); int i = 0; if (columnEnd==columnStart){ //列開始和列結束重合,即最裡圈只剩一個數 list.add(matrix[rowEnd][columnEnd]); return list; } if (rowEnd==rowStart){ //行開始和行結束重合,最裡圈只有一行,將此行加入list for (i = columnStart;i <= columnEnd;i++){ list.add(matrix[rowStart][i]); } return list; } //四個for迴圈遍歷一圈 for (i = columnStart;i <= columnEnd;i++){ list.add(matrix[rowStart][i]); } for (i = rowStart+1;i < rowEnd;i++){ list.add(matrix[i][columnEnd]); } for (i = columnEnd;i>=columnStart;i--){ list.add(matrix[rowEnd][i]); } for (i = rowEnd-1;i>=rowStart+1;i--){ list.add(matrix[i][rowStart]); } return list; } }