数组和矩阵问题
给定一个整型矩阵matrix,用转圈方式打印它
要求额外空间复杂度:O(1)
这里介绍一种 矩阵处理方式, 矩阵分圈处理!!!!!!
思路:
在矩阵中庸左上角的坐标(tR, tC)和右下角(dR, dC)就可以表示一个子矩阵。
比如 当(tR, tC)=(0,0) (dR,dC)=(3,3)时, 表示的子矩阵就是整个矩阵
然后移动 转圈打印就ok了 限制条件是 左上方 跟 右下方的点 相遇
package TT; public class Test14 { public static void spiralOrderPrint(int[][] matrix){ int tR=0; int tC=0; int dR = matrix.length-1; int dC = matrix[0].length-1; while(tR<=dR && tC<=dC){ printEdge(matrix, tR++, tC++, dR--, dC--); } } public static void printEdge(int[][] m, int tR, int tC, int dR, int dC){ if(tR==dR){ //子矩阵只有一行时 for(int i = tC; i<=dC; i++){ System.out.println(m[tR][i]+""); } }else if(tC==dC){ for (int i = tR; i <dR; i++) { System.out.println(m[i][tC]+""); } }else { int curC = tC; int curR = tR; while(curC !=dC){ System.out.println(m[tR][curC]+" "); curC++; } while(curR != dR){ System.out.println(m[curR][dC]+" "); curR++; } while(curC!=tC){ System.out.println(m[dR][curC]+" "); curC--; } while(curR !=tC){ System.out.println(m[curR][tC]+" "); curR--; } } } public static void main(String[] args){ int[][] m = new int[3][3]; m[0][0]=1; m[0][1]=2;m[0][2]=3; m[1][0]=4; m[1][1]=5;m[1][2]=6; m[2][0]=7;m[2][1]=8;m[2][2]=9; spiralOrderPrint(m); } }
测试结果:
其实本题目不难,思路很清晰,重点在于代码实现过程中的代码简洁和技巧。
while 变量的控制问题
所以额外设计了一个函数,弹栈不影响原有的while变量值
public class Test4 { public static void roundPrint(int[][] arr) { int row = 0; int col = 0; int rowEnd = arr.length-1; int colEnd = arr[0].length-1; while (row !=rowEnd && col !=colEnd) { roundPriting(arr, row, col, rowEnd, colEnd); row++; col++; rowEnd--; colEnd--; } //一行或者一列时候的问题 同处一条线上的问题 if (col == colEnd) { //同一列 while (row<=rowEnd) { System.out.println(arr[row][col]); row++; } }else if (row==rowEnd) { //同一行 while (col<=colEnd) { System.out.println(arr[row][col]); col++; } } } public static void roundPriting(int[][] arr, int row, int col, int rowEnd, int colEnd) { while (row<rowEnd) { System.out.print(arr[row][col]+","); row++; } while (col<colEnd) { System.out.print(arr[row][col]+","); col++; } while (row > 0) { System.out.print(arr[row][col]+","); row--; } while (col > 0) { System.out.print(arr[row][col]+","); col--; } } public static void main(String[] args) { int[][] arr = new int[3][4]; arr[0][0] = 1; arr[1][0] = 2; arr[2][0] = 3; arr[0][1] = 4; arr[1][1] = 5; arr[2][1] = 6; arr[0][2] = 7; arr[1][2] = 8; arr[2][2] = 9; arr[0][3] = 10; arr[1][3] = 11; arr[2][3] = 12; roundPrint(arr); } }