一、題目名稱java
Spiral Matrix(螺旋輸出矩陣中的元素)code
二、題目地址element
https://leetcode.com/problems/spiral-matrix/leetcode
三、題目內容開發
英文:Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spiral order.get
中文:給出一個m行n列的矩陣,以螺旋順序返回矩陣中的全部元素。io
例如:現有矩陣以下:class
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ]
則輸出應爲 [1, 2, 3, 6, 9, 8, 7, 4, 5]import
四、解題方法1List
一種方法是使用四個數字分別記錄上下左右四個邊界的位置,不斷循環收窄這些邊界,最終當兩個邊界重疊時,結束循環。
Java代碼以下:
import java.util.LinkedList; import java.util.List; /** * @功能說明:LeetCode 54 - Spiral Matrix * @開發人員:Tsybius2014 * @開發時間:2015年11月2日 */ public class Solution { public List<Integer> spiralOrder(int[][] matrix) { LinkedList<Integer> linkedList = new LinkedList<Integer>(); if (matrix == null || matrix.length == 0) { return linkedList; } //左右上下四個邊界 int left = 0; int right = matrix[0].length - 1; int top = 0; int bottom = matrix.length - 1; int i; while (true) { //上邊,自左至右 for (i = left; i <= right; i++) { linkedList.add(matrix[top][i]); } if (++top > bottom) { break; } //右邊,自上至下 for (i = top; i <= bottom; i++) { linkedList.add(matrix[i][right]); } if (left > --right) { break; } //下邊,自右至左 for (i = right; i >= left; i--) { linkedList.add(matrix[bottom][i]); } if (top > --bottom) { break; } //左邊,自下至上 for (i = bottom; i >= top; i--) { linkedList.add(matrix[i][left]); } if (++left > right) { break; } } return linkedList; } }
五、解題方法2
另外一種方法是預先指定好遍歷四個邊時的座標增減方向,並在每次沿一個方向行進完畢後,計算出下個方向應行進的單位數。
Java代碼以下:
import java.util.LinkedList; import java.util.List; /** * @功能說明:LeetCode 54 - Spiral Matrix * @開發人員:Tsybius2014 * @開發時間:2015年11月2日 */ public class Solution { public List<Integer> spiralOrder(int[][] matrix) { LinkedList<Integer> linkedList = new LinkedList<Integer>(); if (matrix == null || matrix.length == 0) { return linkedList; } //行進方向 int[][] direction = new int[][] {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; //以初始點(0,0)的初始行進方向計算出的初始點前一個點的行列座標 int x = 0; int y = -1; //矩陣的行數和列數 int m = matrix.length; int n = matrix[0].length; //counter決定了轉動的具體方向 int counter = 0; while (m > 0 && n > 0) { int k; //判斷橫向移動仍是縱向移動 if (counter % 2 == 0) { k = n; m--; } else { k = m; n--; } //沿一個方向進行移動 while (k-- != 0) { x += direction[counter][0]; y += direction[counter][1]; linkedList.add(matrix[x][y]); } //調整方向 counter = (counter + 1) % 4; } return linkedList; } }
END