劍指offer之順序列印陣列

龍韜發表於2020-11-09

演算法的要求為:

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

解題的思路為:

要求順時針列印矩陣,列印的順序為

  • 頂部一行(從左到右)
  • 右側一列(從上到下)
  • 底部一行(從右到左)
  • 左側一行(從下到上)
    具體的列印矩陣的順序為如下圖所示:

遇到的問題

我之前在寫這個演算法的過程中遇到了無法完整列印矩陣與陣列指標越界的問題,我在仔細思考過後,發現時沒有正確的處理在while迴圈過程中的跳出操作。
其實應該在每一個for迴圈過後都要進行判斷,判斷left>right或者up>down,如果為true,則說明矩陣已經列印完成,應該跳出while迴圈。

程式碼的實現

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> printMatrix(int [][] matrix) {
       ArrayList<Integer> arr = new ArrayList<>();
        if(matrix.length == 0 || matrix == null || matrix[0].length == 0) return arr;
        int up = 0, left = 0;
        int right = matrix[0].length-1, down=matrix.length-1;
        while(true){
            // 最上面的一行程式碼進行遍歷
            for(int i=left; i<=right; i++){
                arr.add(matrix[up][i]);
            }
            up ++;
            if(up > down) break;
            
            //遍歷最左邊的一列
            for(int i=up; i<=down; i++){
                arr.add(matrix[i][right]);
            }
            right --;
            if(left > right) break;
            
            //遍歷最底部一行
            for(int i=right; i>= left; i--){
                arr.add(matrix[down][i]);
            }
            down --;
            if(up >down) break;
            
            //遍歷最左側一列
            for(int i=down; i>= up; i--){
                arr.add(matrix[i][left]);
            }
            left ++;
            if(left > right) break;
        }
        
        return arr;
    }
    
}

相關文章