【劍指offer】面試題29-順時針打印矩陣

題目描述

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

1.思路

參考官方思路來的,複述一下官方思路:

  • 1.觀察每一圈左上角元素的下標,其橫縱座標是相同的,設爲(start, start);
  • 2.考慮不同的矩陣形狀,我們 假設矩陣的行數爲row,列數爲col ,可以總結出一個規律,循環執行的條件是row > start * 2 && clo > start * 2
  • 3.下面考慮怎樣打印每一圈:把打印一圈分成四部分,
    (1)從左到右打印一行:不管形狀怎麼樣,因爲是順時針打印,所以這一步是必須執行的,不需要考慮這一行的元素有多少,直接找到兩端遍歷打印就可以了;
    (2)從上到下打印一列:如果只有一行,那就不需要執行這一步,所以要執行這一步的條件是起始行號大於起始列號
    (3)從右到左打印一行:如果只有一列,那麼這一步不需要執行,所以執行條件是列數不少於2,即終止列號大於起始列號
    (4)從下到上打印一列:如果要執行這一步,那麼矩陣至少要有三行兩列,因此要求終止行號比起始行號至少大2,同時終止列號要大於起始列號

2. 代碼(Java實現)

import java.util.ArrayList;
/**
 * @author : Eleven482-LiQiang
 * @version: 2020年2月16日 上午11:15:03
 */
public class Solution {
	ArrayList<Integer> list = new ArrayList<>();
	public ArrayList<Integer>  printMatrix(int[][] matrix) {

		int start = 0;
		int row = matrix.length;
		int col = matrix[0].length;

		while (col > start * 2 && row > start * 2) {
			PrintMatrixCircle(matrix, col, row, start,list);
			++start;
		}
		return list;
	}

	private void PrintMatrixCircle(int[][] matrix, int col, int row, int start,ArrayList<Integer> list) {
		// TODO Auto-generated method stub
		int endX = col - 1 - start;
		int endY = row - 1 - start;

		// 從左到右打印一行
		for (int i = start; i <= endX; i++) {
			list.add(matrix[start][i]);
			// System.out.print(matrix[start][i] + " ");
		}

		// 從上到下打印一列
		if (start < endY) {
			for (int i = start + 1; i <= endY; i++) {
				list.add(matrix[i][endX]);
				// System.out.print(matrix[i][endX] + " ");
			}
		}

		// 從右到左打印一行
		if (start < endX && start < endY) {
			for (int i = endX - 1; i >= start; i--) {
				list.add(matrix[endY][i]);
				// System.out.print(matrix[endY][i] + " ");
			}
		}

		// 從下到上打印一列
		if (start < endX && start < endY - 1) {
			for (int i = endY - 1; i >= start + 1; i--) {
				list.add(matrix[i][start]);
				// System.out.print(matrix[i][start] + " ");
			}
		}

	}
}

tips:把抽象的問題圖形化,往往能更快的找到思路

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章