1. 程式人生 > 其它 >【劍指offer較難部分7】順時針列印矩陣(java)

【劍指offer較難部分7】順時針列印矩陣(java)

技術標籤:劍指offer(java)演算法java資料結構

題目描述

輸入一個矩陣,按照從外向裡以順時針的順序依次打印出每一個數字,例如,如果輸入如下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; } }

在這裡插入圖片描述