【劍指offer較難部分7】順時針列印矩陣(java)
阿新 • • 發佈:2021-01-05
題目描述
輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下4 × 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.
分析
大致演算法思路就是從左到右,從上到下,從右到左,從下到上遍歷。
遍歷方向共有4種,右,下,左,上。
當前遍歷方向:1 表示 右,2 表示 下,3 表示 左,4 表示 上
dir為direction縮寫
(1)向右移動到底,改變方向向下,行索引 row+1
(2)向下移動到底,改變方向向左。行索引 row 不變,列索引 col-1;
(3)向左移動到底,改變方向向上,行索引 row-1,列索引不變;
(4)向上移動到底,改變方向向右,行索引 row 不變,列索引 col+1;
注:程式碼中為了與區分開始設定的總行數rows,總列數cols,中間行列變化用,i 與 j 表示
實現程式碼如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> list = new ArrayList<Integer>();
if(matrix == null || matrix.length == 0){
return list;
}
int rows = matrix.length;
int cols = matrix[0].length;
// 1.記錄元素是否已經遍歷過的陣列 boolean[][] flagArr,預設值均為false;
boolean [][] flagArr = new boolean[rows][cols];
// 2.遍歷索引,設定初始值
int i = 0, j = -1;
// 3.當前遍歷方向:1:右,2:下,3:左,4:上
int dir = 1;// 初始為向右
// 開始遍歷
while (list.size() < rows * cols) {// 未遍歷完
// 根據當前方向判斷前進方向,即按照目前方向判斷當前元素是否可以列印
if (dir == 1) {// 向右
j++;
if (j == cols || flagArr[i][j]) {// 向右到達邊界或者當前元素已經遍歷過
j--; // 回到前一個位置,下標表示最後一個應該是cols-1
dir = 2;// 方向變為向下
}
}
if (dir == 2) {// 向下
i++;
if (i == rows || flagArr[i][j]) {
i--;
dir = 3;// 方向變為向左
}
}
if (dir == 3) {// 向左
j--;
if (j < 0 || flagArr[i][j]) {
j++;
dir = 4;// 方向變為向上
}
}
if (dir == 4) {// 向上
i--;
if (i < 0 || flagArr[i][j]) {
i++;
dir = 1;// 方向變為向右
}
}
if (!flagArr[i][j])
list.add(matrix[i][j]); //新增入list
flagArr[i][j] = true;//當前位置記為已經遍歷過
}
return list;
}
}