演算法——之”字形列印矩陣
阿新 • • 發佈:2018-12-30
【題目】
給定一個矩陣matrix,按照“之”字形的方式列印這 個矩陣,
例如:1,2,3,4,5,6,7,8,9,10,11,12
“之”字形列印的結果為:1,2,5,9,6,3,4,7,10,11, 8,12
【要求】 額外空間複雜度為O(1)。
思路:
使用巨集觀思想,千萬不要把思路限制在區域性。
①設計A,B指標一開始都在(0,0)位置
②A總是向右移動,B總是向下移動,當A運動到最右,往下移動,當B運動到最下,往右移動【A、B每次都走一步】,A和B每次都可以劃出一個對角線。
最後A、B重合,我們只需要做的就是,通過A,B兩個座標,打印出對角線上的值,而之字型列印是有順序的【左下到右上還是右上到左下】,我們只需要認為引入一個boolean量做區分即可。
具體程式碼實現:
/** * 之字形列印 */ public class ZigZagPrint { public void printMatrixZigZag(int[][] matrix){ int aR = 0; int aC = 0; int bR = 0; int bC = 0; int endR = matrix.length - 1; int endC = matrix[0].length - 1; boolean fromUp = false; while(aR != endR + 1){ printLevel(matrix,aR,aC,bR,bC,fromUp); aR = aC == endC ? aR + 1: aR; aC = aC == endC ? aC : aC + 1; bC = bR == endR ? bC + 1 : bC; bR = bR == endR ? bR : bR + 1; fromUp = !fromUp; } System.out.println(); } private void printLevel(int[][] matrix, int aR, int aC, int bR, int bC, boolean fromUp) { if (fromUp) { while (aC != bC - 1) { System.out.print(matrix[aR++][aC--] + " "); } } else { while (bC != aC + 1) { System.out.print(matrix[bR--][bC++] + " "); } } } @Test public void test(){ int[][] matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}}; printMatrixZigZag(matrix); } }