On a 2 dimensional grid with R
rows and C
columns, we start at (r0, c0)
facing east.java
Here, the north-west corner of the grid is at the first row and column, and the south-east corner of the grid is at the last row and column.ide
Now, we walk in a clockwise spiral shape to visit every position in this grid. this
Whenever we would move outside the boundary of the grid, we continue our walk outside the grid (but may return to the grid boundary later.) spa
Eventually, we reach all R * C
spaces of the grid.code
Return a list of coordinates representing the positions of the grid in the order they were visited.ci
Example 1:leetcode
Input: R = 1, C = 4, r0 = 0, c0 = 0 Output: [[0,0],[0,1],[0,2],[0,3]]
Example 2:rem
Input: R = 5, C = 6, r0 = 1, c0 = 4 Output: [[1,4],[1,5],[2,5],[2,4],[2,3],[1,3],[0,3],[0,4],[0,5],[3,5],[3,4],[3,3],[3,2],[2,2],[1,2],[0,2],[4,5],[4,4],[4,3],[4,2],[4,1],[3,1],[2,1],[1,1],[0,1],[4,0],[3,0],[2,0],[1,0],[0,0]]
Note:get
1 <= R <= 100
1 <= C <= 100
0 <= r0 < R
0 <= c0 < C
題目地址it
這道題花了我很多時間,主要在於沒有找到規律。螺線中有一條很重要的規律,臂長的增加是有規律的:1 1 2 2 3 3 ...
而後就是結束條件如何設定,這裏我使用了堆滿結果空間就返回的方式。
class Solution { public int[][] spiralMatrixIII(int R, int C, int r0, int c0) { int[][] result = new int[R*C][2]; int count=0; result[0] = new int[]{r0, c0}; int size=0; while(count<R*C-1){ size++; for(int j=1;j<=size;j++){ c0 = c0+1; if(r0>=0 && c0>=0 && r0<R && c0<C){ result[++count] = new int[]{r0, c0}; if(count==R*C-1){ return result; } } } for(int j=1;j<=size;j++){ r0=r0+1; if(r0>=0 && c0>=0 && r0<R && c0<C){ result[++count] = new int[]{r0, c0}; if(count==R*C-1){ return result; } } } size++; for(int j=1;j<=size;j++){ c0 = c0-1; if(r0>=0 && c0>=0 && r0<R && c0<C){ result[++count] = new int[]{r0, c0}; if(count==R*C-1){ return result; } } } for(int j=1;j<=size;j++){ r0=r0-1; if(r0>=0 && c0>=0 && r0<R && c0<C){ result[++count] = new int[]{r0, c0}; if(count==R*C-1){ return result; } } } } return result; } }