classSolution{List<Integer> ans =newArrayList<>();publicList<Integer>spiralOrder(int[][] matrix){// 試試遞歸recursion(matrix,0, matrix.length -1,0, matrix[0].length -1);return ans;}// 一次一圈voidrecursion(int[][] matrix,int low,int height,int left,int right){if(low > height || left > right){return;}// 一行情況if(height == low){for(int i = left; i <= right; i++){ans.add(matrix[low][i]);}return;}// 一列情況elseif(left == right){for(int i = low; i <= height; i++){ans.add(matrix[i][left]);}return;}// 其他情況for(int i = left; i <= right; i++){ans.add(matrix[low][i]);}for(int i = low +1; i <= height; i++){ans.add(matrix[i][right]);}for(int i = right -1; i >= left; i--){ans.add(matrix[height][i]);}for(int i = height -1; i > low; i--){ans.add(matrix[i][left]);}recursion(matrix, low +1, height -1, left +1, right -1);}}
迭代
貼一貼吧,不過看遞歸的也夠了
classSolution{publicList<Integer>spiralOrder(int[][] matrix){// 迭代寫法List<Integer> ans =newArrayList<>();// 一行的情況if(matrix.length ==1){for(int i =0; i < matrix[0].length; i++){ans.add(matrix[0][i]);}return ans;}if(matrix[0].length ==1){for(int i =0; i < matrix.length; i++){ans.add(matrix[i][0]);}return ans;}// 碰壁改變方向,更新墻壁值int left =0, right = matrix[0].length -1;int low =1, height = matrix.length -1;// 右 -》 下,下 -》左,左 -》上,上 => 右邊// 右下左上 0,1,2,3int[][] directions =newint[][]{{0,1},{1,0},{0,-1},{-1,0}};int forDir =0;int[] direction = directions[forDir];int x =0, y =0;ans.add(matrix[x][y]);boolean flag =true;while(flag){flag =false;if(forDir ==0){while(y +1<= right){ans.add(matrix[x][y +1]);flag =true;y++;}forDir++;right--;}elseif(forDir ==1){while(x +1<= height){ans.add(matrix[x +1][y]);flag =true;x++;}forDir++;height--;}elseif(forDir ==2){while(y -1>= left){ans.add(matrix[x][y -1]);flag =true;y--;}forDir++;left++;}elseif(forDir ==3){while(x -1>= low){ans.add(matrix[x -1][y]);flag =true;x--;}forDir =0;low++;}}return ans;}}