來源:https://leetcode-cn.com/probl...java
簡潔解法:設定邊界,模擬便可。spa
class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> ans = new ArrayList<>(); int t = 0, b = matrix.length - 1; int l = 0, r = matrix[0].length - 1; while (true) { for (int j = l; j <= r; j++) // left to right ans.add(matrix[t][j]); if (++t > b) break; for (int i = t; i <= b; i++) // top to bottom ans.add(matrix[i][r]); if (--r < l) break; for (int j = r; j >= l; j--) // right to left ans.add(matrix[b][j]); if (--b < t) break; for (int i = b; i >= t; i--) // bottom to top ans.add(matrix[i][l]); if (++l > r) break; } return ans; } }
參考:https://leetcode-cn.com/probl...3d
注意由於該題矩陣不是正方形,因此不可以用 while (num < total)
做爲外層循環判斷條件,緣由能夠參考示例2,當外邊循環一圈後,只剩下6和7時,l = 1, r = 2, t = 1, b = 1
,內層第一個 for 循環會把6,7加入到結果中,可是到第四個 for 循環時,l = 1, r = 1, t = 2, b = 0
,因爲 l <= r
因此6會被又一次加入結果集中,這樣結果就不對了。code
來源:https://leetcode-cn.com/probl...blog
class Solution { public int[][] generateMatrix(int n) { int[][] mat = new int[n][n]; int l = 0, r = n - 1; int t = 0, b = n - 1; int num = 1, total = n * n; while(num <= total){ for(int i = l; i <= r; i++) // left to right mat[t][i] = num++; t++; for(int i = t; i <= b; i++) // top to bottom mat[i][r] = num++; r--; for(int i = r; i >= l; i--) // right to left mat[b][i] = num++; b--; for(int i = b; i >= t; i--) // bottom to top mat[i][l] = num++; l++; } return mat; } }
參考:https://leetcode-cn.com/probl...ci
https://leetcode-cn.com/probl...leetcode
咱們能夠從開始的正方形開始,以螺旋形的形狀行走,而忽略咱們是否呆在網格中。最終,咱們必定已經到達了網格的每個角落。get
檢查咱們在每一個方向的行走長度,咱們發現以下模式:1,1,2,2,3,3,4,4,... 即咱們先向東走 1 單位,而後向南走 1 單位,再向西走 2 單位,再向北走 2 單位,再向東走 3 單位,等等。it
規律:A0 = 1, A1 = 1, A2 = 2, A3 = 2, ..., An= n / 2 + 1
io
方向轉換:(0, 1) -> (1, 0) -> (0, -1) -> (-1, 0)
四個方向循環
規律:(dx, dy) -> (dy, -dx) -> (-dx, -dy) -> (-dy, dx)
public int[][] spiralMatrixIII(int R, int C, int x, int y) { int[][] ans = new int[R * C][2]; int n = 0; int dx = 0, dy = 1; int num = 0, total = R * C; while (num < total) { for (int i = 0; i < n / 2 + 1; i++) { if (x >= 0 && x < R && y >= 0 && y < C) { ans[num++] = new int[] {x, y}; } x += dx; y += dy; } int tmp = dx; dx = dy; dy = -tmp; n++; } return ans; }