概述
【题目】
给定一个矩阵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);
}
}
最后
以上就是神勇羽毛为你收集整理的算法——之”字形打印矩阵的全部内容,希望文章能够帮你解决算法——之”字形打印矩阵所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复