标签:子矩阵 -- solution 完成后 else etc col 完成 color
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5]
示例 2:
输入: [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12] ] 输出: [1,2,3,4,8,12,11,10,9,5,6,7]
思路:把每次打印看成是打印当前矩阵的外圈,当前矩阵打印完成后,找到其子矩阵,继续打印子矩阵的外圈。
比如例子1的矩阵 1 2 3
4 6
7 8 9
如何确定一个矩阵,只需要确定其左上角的点和右下角的点,我们把左上角的点即为(tR,tC) 把右下角的点记为(dR,dC)
(0,0) (2,2)即为上面矩阵的两个点,打印一圈后,左上角的点往右下移动一个位置,右下角的点往左上移动一个位置,停止条件为,左上角的点跑到右下角点的右边或者下边。
1 class Solution { 2 public List<Integer> spiralOrder(int[][] matrix) { 3 List<Integer> list = new ArrayList<>(); 4 if(matrix.length == 0 || matrix == null)return list; 5 int tR = 0; 6 int tC = 0; 7 int dR = matrix.length - 1; 8 int dC = matrix[0].length - 1; 9 while (tR <= dR && tC <= dC){ 10 printEdge(matrix,tR++,tC++,dR--,dC--,list); 11 } 12 return list; 13 } 14 public static void printEdge(int[][] m,int tR,int tC,int dR,int dC,List<Integer> list){ 15 if(tR == dR){ 16 for(int i = tC;i <= dC;i++){ 17 list.add(m[tR][i]); 18 } 19 }else if (tC == dC){ 20 for(int i = tR;i <= dR;i++){ 21 list.add(m[i][tC]); 22 } 23 }else{ 24 int curC = tC; 25 int curR = tR; 26 while(curC != dC){ 27 list.add(m[tR][curC]); 28 curC++; 29 } 30 while (curR != dR){ 31 list.add(m[curR][dC]); 32 curR++; 33 } 34 while(curC != tC){ 35 list.add(m[dR][curC]); 36 curC--; 37 } 38 while(curR != tR){ 39 list.add(m[curR][tC]); 40 curR--; 41 } 42 } 43 } 44 }
参考:程序员代码面试指南
2019-05-13 15:47:27
标签:子矩阵 -- solution 完成后 else etc col 完成 color
原文地址:https://www.cnblogs.com/NPC-assange/p/10857053.html