1、螺旋打印矩阵
以下都要求:额外空间复杂度为O(1),即只用变量,原地打印
先确定左上点和右下点,先打出边框,然后向内调整点的位置,循环打印,如图所示:
完整代码如下
package cn.nupt;
/**
* @Description: 顺时针螺旋打印矩阵
*
* @author PizAn
* @date 2019年2月16日 下午10:01:39
*
*/
public class PrintMatrixSpiralOrder {
public void printMatrixSpiralOrder(int[][] arr) {
int tR = 0; // 左上角点的行号
int tC = 0; // 左上角点的列号
int dR = arr.length - 1; // 右下角点的行号:就是一维数组的数目 - 1
int dC = arr[0].length - 1; // 右下角点的列号:就是一维数组的长度
while (tR <= dR && tC <= dC) {
printLine(arr, tR++, tC++, dR--, dC--); // 打印以这四个点围成的边界,然后缩小圈子
}
}
private void printLine(int[][] arr, int tR, int tC, int dR, int dC) {
if (tR == dR) {
// 行相同,即当还剩一列的时候,从上到下打印这一列(因为是顺时针旋转,必定是一圈打完之后调整四个点的位置)
/* for (int i = tC; i <= dC; i++) {
System.out.println(arr[tR][i] + " ");
}*/
while (tC <= dC) {
System.out.println(arr[tR][tC++]);
}
} else if (tC == dC) {
// 列相同,即当还剩一行的时候,从左道由打印这一行(因为是顺时针旋转)
/* for (int i = tR; i <= dR; i++) {
System.out.println(arr[i][tC] + " ");
}*/
while (tR <= dR) {
System.out.println(arr[tR++][tC]);
}
}else {
//打印边框
int curC = tC;
int curR = t