一、转圈打印矩阵
思路:取矩阵左上角点和右下角点,每次打印外围一圈,然后缩小矩阵范围
public static void main(String[] args) {
int[][] matrix = {
{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}
};
int x1 = 0,y1=0;
int x2 = matrix.length-1, y2=matrix[0].length-1;
while(x1 < x2) {
printEdge(matrix,x1,y1,x2,y2);
x1++; y1++;
x2--;y2--;
}
}
public static void printEdge(int[][] m ,int x1,int y1,int x2,int y2) {
int tempX1=x1,tempY1=y1;
int tempX2=x2,tempY2=y2;
while(y1 < tempY2) System.out.print(m[x1][y1++]+" ");//向右
while(x1 < tempX2) System.out.print(m[x1++][y1]+" ");//向下
while(y2 > tempY1) System.out.print(m[x2][y2--]+" ");//向左
while(x2 > tempX1) System.out.print(m[x2--][y2]+" ");//向上
}
二、“之”字形打印矩阵
思路:
public static void printMatrixZigZag(int[][] matrix) {
int tR = 0;
int tC = 0;
int dR = 0;
int dC = 0;
int endR = matrix.length - 1;
int endC = matrix[0].length - 1;
boolean fromUp = false;
while (tR != endR + 1) {
printLevel(matrix, tR, tC, dR, dC, fromUp);
tR = tC == endC ? tR + 1 : tR;
tC = tC == endC ? tC : tC + 1;
dC = dR == endR ? dC + 1 : dC;
dR = dR == endR ? dR : dR + 1;
fromUp = !fromUp;
}
System.out.println();
}
public static void printLevel(int[][] m, int tR, int tC, int dR, int dC,
boolean f) {
if (f) {
while (tR != dR + 1) {
System.out.print(m[tR++][tC--] + " ");
}
} else {
while (dR != tR - 1) {
System.out.print(m[dR--][dC++] + " ");
}
}
}
三、在有序行列矩阵中找数
思路:利用有序的特点,有选择性地查找判断,如同二分思想,取左下角的点或者右上角的点为基值
假设选取右上角的点5,K>5往下寻找7,K<7往左寻找,不停往下,如果越界则不存在,否则必定能查找到
public static void main(String[] args) {
int[][] matrix = {
{0,1,2,5},{2,3,4,7},{4,4,4,8},{5,7,7,9}
};
Scanner in = new Scanner(System.in);
int k = in.nextInt();
System.out.println(isFind(matrix, k));
}
private static boolean isFind(int[][] m,int k) {
int x = m.length-1,y=0;
int endY = m[0].length-1;
while(x > 0 || y < endY) {
if(m[x][y] < k) y++;
else if(m[x][y] > k) x--;
else return true;
}
return false;
}
小结:不要想着坐标一个个移动,这样很容易出错,而且麻烦,要从宏观角度出发