【劍指offer】順時針打印矩陣

題目

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

刷 LeetCode 看到的大神題解,感覺容易理解且好寫
簡單來說,就是不斷地收縮矩陣的邊界
定義四個變量代表範圍,up、down、left、right

  1. 向右走存入整行的值,當存入後,該行再也不會被遍歷,代表上邊界的 up 加一,同時判斷是否和代表下邊界的 down 交錯
  2. 向下走存入整列的值,當存入後,該列再也不會被遍歷,代表右邊界的 right 減一,同時判斷是否和代表左邊界的 left 交錯
  3. 向左走存入整行的值,當存入後,該行再也不會被遍歷,代表下邊界的 down 減一,同時判斷是否和代表上邊界的 up 交錯
  4. 向上走存入整列的值,當存入後,該列再也不會被遍歷,代表左邊界的 left 加一,同時判斷是否和代表右邊界的 right 交錯

2. 代碼

 public ArrayList<Integer> printMatrix(int[][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        if (matrix == null || matrix.length == 0) {
            return list;
        }
        int up = 0;
        int down = matrix.length - 1;
        int left = 0;
        int right = matrix[0].length - 1;
        while (true) {
            // 向右
            for (int i = left; i <= right; i++) {
                list.add(matrix[up][i]);
            }
            if (++up > down) {
                break;
            }
            // 向下
            for (int i = up; i <= down; i++) {
                list.add(matrix[i][right]);
            }
            if (--right < left) {
                break;
            }
            // 向左
            for (int i = right; i >= left; i--) {
                list.add(matrix[down][i]);
            }
            if (--down < up) {
                break;
            }
            // 向上
            for (int i = down; i >= up; i--) {
                list.add(matrix[i][left]);
            }
            if (++left > right) {
                break;
            }
        }
        return list;
    }

3. 複雜度

時間複雜度:O(n)O(n)
空間複雜度:O(1)O(1)

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