牛客網算法(十九):順時針打印矩陣

題目描述

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

題目分析

        我們可以將矩陣看成由若干個圈組成,每轉一圈就是一層,依次轉完所有圈,就得到了二維數組所有的數。

Java實現

	public ArrayList<Integer> printMatrix(int [][] matrix) {
        ArrayList<Integer> result=new ArrayList<Integer>();  //將順時針輸出的矩陣元素都存放在結果列表裏
        if(matrix.length==0) return result;  //如果矩陣行數爲0,說明是空矩陣,則直接返回空列表
        int row=matrix.length,column=matrix[0].length;  //初始化矩陣行數和列數
        if(column==0) return result;  //如果矩陣行數不爲0,矩陣的列數爲0,意味着矩陣由空元素組成,依然返回空列表
        /*
        * layers是循環遍歷的層數,由行和列的較小值決定,-1是爲了考慮較小值爲奇數的情況,
        * 除以2是因爲每次循環都會因頂部從左到右和底部從右到左而用掉2行,所以只取一半,
        * +1是爲了補償之前-1造成的奇數情況下的0.5層以及偶數情況下少1層
        * */
        int layers=(Math.min(row,column)-1)/2+1;
        for(int i=0;i<layers;i++){
            /*
            * 從左上到右上是從對角線元素開始,因爲每上一輪的從左下到左上會多用掉1個當前行前面的元素,所以一開始j=i。
            * 遍歷索引小於矩陣列數減去當前循環層數,因爲前幾輪從右上到右下會用掉當前行後面的元素
            * */
            for(int j=i;j<column-i;j++) result.add(matrix[i][j]);
            /*
            * 從右上到右下,因爲這一輪的從左上到右上會多用掉當前列上面的1個元素,所以一開始k=i+1。
            * 遍歷索引小於矩陣行數減去當前循環層數,因爲前幾輪從右下到左下會用掉當前列下面的元素。
            * 矩陣列的最大索引爲column-1(從0開始),所以填充列表result的元素列號爲列最大索引減去循環層數,因爲前幾輪從右上到右下會用掉當前列後幾列的元素
            * */
            for(int k=i+1;k<row-i;k++) result.add(matrix[k][column-1-i]);
            /*
            * 從右下到左下,矩陣列的最大索引爲column-1(從0開始),因爲這一輪的從右上到右下多用了一個當前行後面的元素,再結合前幾輪從右上到右下用掉的後面i個元素,所以一開始j=column-1-i-1。
            * 從右下到左下過程中最後當前列的索引要大於等於循環層數,因爲前幾輪從左下到左上用掉了前i-1列元素,所以j>=i。
            * 同時考慮矩陣行數小於列數(如3行6列)的情況,使行的最大索引row-1(行號從0開始)減去當前循環層數不會等於當前循環層數,否則最後一輪從左上到右上之後,接下來會再重複這一輪同樣元素的從右下到左下。
            * 填充列表result的元素行號爲行最大索引減去循環層數,因爲前幾輪從右下到左下會用掉當前行下面幾行的元素
            * */
            for(int j=column-2-i;(j>=i)&&(row-1-i!=i);j--) result.add(matrix[row-1-i][j]);
            /*
            * 從左下到左上,矩陣行的最大索引爲row-1(從0開始),因爲這一輪的從右下到左下多用了1個當前列後面的元素,再結合前幾輪從左下到左上用掉的下面i個元素,所以一開始k=row-1-i-1。
            * 從左下到左上過程中最後當前行的索引要大於循環層數,和上一行的j>=i不同,這裏如果有了等號最後會重複到這一輪的從左上到右上過程的第一個元素,所以k>i。
            * 同時考慮矩陣列數小於行數(如6行3列)的情況,使列的最大索引column-1減去當前循環層數不會等於當前循環層數,否則最後一輪從右上到右下後,接下來會再重複這一輪同樣元素的從左下到左上。
            * 填充列表result的元素列號與當前一輪從左上到右上的開頭元素的列索引相同,都爲i
            * */
            for(int k=row-2-i;(k>i)&&(column-1-i!=i);k--) result.add(matrix[k][i]);
        }
        return result;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章