題目:給定一個矩陣matrix,按照“之”字形的方式打印這個矩陣,例如:
打印結果爲:4,5,6,1,6,6,9,3,7。
要求額外空間複雜度爲O(1)。
算法思想:打印“之”字形數字
算法思想:根據上例容易觀察出之字形可以拆分成打印上圖直線上的數字,只需將打印方向改變就可以滿足題目要求。設置兩個初始點A和B,同時讓點A向右移動,點B向下移動,當A移動到右邊界時再繼續向下移動,當B移動到下邊界時再向右移動。A和B每移動一次就打印AB直接上的數字,退出條件爲row1>endR或col2>endC。
代碼如下:
package test_class_03;
public class ZigZagPrintMatrix {
public static void printMatrixZigZag(int [][]m){
//定義A,B兩個初始點以及終點End
int row1=0;
int col1=0;
int row2=0;
int col2=0;
int endR=m.length-1;
int endC=m[0].length-1;
boolean fromup=false;
while(row1!=endR+1){
printLine(m,row1,col1,row2,col2,fromup);
row1=col1==endC?row1+1:row1; //A點剛開始移動時是行不變列 變,所以更新時應該將不變的行row1放在前面。
col1=col1==endC?col1:col1+1;
col2=row2==endR?col2+1:col2; //B點剛開始移動時是行變列不變,所以更新時應該將不變的列col2放在前面。
row2=row2==endR?row2:row2+1;
fromup=!fromup;
}
System.out.println();
}
public static void printLine(int [][]m,int row1,int col1,int row2,int col2,boolean fromup){
if(fromup){
while(row1!=row2+1){
System.out.print(m[row1++][col1--]+" ");
}
}else{
while(row2!=row1-1){
System.out.print(m[row2--][col2++] + " ");
}
}
}
public static void main(String[] args) {
int [][]m={{4,5,6},{6,6,9},{1,3,7}};
printMatrixZigZag(m);
}
}