确定要打印斜线的两个端点(从左上角开始(0,0),(0,0)),然后打印一条斜线,用一个boolean变量记录打印的方向
上面的端点从左向右移动,到达右边界后,再从上向下移动。
下面的端点从上到下移动,到达下边界后,再从左向右移动。
直到两个端点重合在(n-1,m-1)停止。
public int[] printZMatrix(int[][] matrix) {
// write your code hereif(matrix==null || matrix.length==0){
return new int[0];
}
int x1=0;
int y1=0;
int x2=0;
int y2=0;
List<Integer>list=new ArrayList<Integer>();
boolean flag=true;
int row=matrix.length;
int col=matrix[0].length;
while(x1<row && y2<col){
printLine(matrix,x1,y1,x2,y2,!flag,list);//打印(x1,y1),(x2,y2)确定的一条斜线
flag=!flag;//转化打印方向
y1++;
}else{//到达右边界后向下移动
x1++;
}
if(x2<row-1){//向下移动
x2++;
}else{//到达下边界后向右移动
y2++;
}
}
int []res=new int[list.size()];
int i=0;
for(Integer k:list){
res[i++]=k;
}
return res;
}
//这个函数专门用来打印一条斜线
//flag在true和false中转换,代表从 左下到右上打印 和 从右上到左下打印 方向变化
//(x1,y1)和(x2,y2)分别表示斜线的两个端点,
public void printLine(int[][] matrix,int x1,int y1,int x2,int y2,boolean flag, List<Integer>list){if(flag){
while(x1<=x2 && y1>=y2){
list.add(matrix[x1++][y1--]);
}
}else{
while(x2>=x1 && y2<=y1){
list.add(matrix[x2--][y2++]);
}
}
}