leetcode讲解--885. Spiral Matrix III

题目

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. 1 <= R <= 100
  2. 1 <= C <= 100
  3. 0 <= r0 < R
  4. 0 <= c0 < C

题目地址it

讲解

这道题花了我很多时间,主要在于没有找到规律。螺线中有一条很重要的规律,臂长的增加是有规律的:1 1 2 2 3 3 ...

而后就是结束条件如何设定,这里我使用了堆满结果空间就返回的方式。

Java代码

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;
    }
}
相关文章
相关标签/搜索