螺旋矩阵

2019-04-09  本文已影响0人  最困惑的时候就是能成长的时候

螺旋矩阵

1.想法:

\left[ \begin{matrix} 1 & 2& 3 & 4 \\ 5& 6 & 7 & 8 \\ 9 & 10 & 11 & 12 \\ 13 & 14 & 15 & 16 \end{matrix} \right]
对于矩阵的螺旋我们可以规约为4个方向

image.png
我们使用0代表向右,1代表向下,2代表向左,3代表向上
那么可以得出向右的时候是y坐标++,同理可得其他方向
我们的两条准则:
1.我们遇到数组边界或者已经被遍历过了的数就换方
2.当换了方向的第一个数已经被遍历过说明整个数组被遍历了

2.代码:

 List<Integer> result = new ArrayList<>();
        if(matrix.length == 0) return result;
        int[][] flag = new int[matrix.length][matrix[0].length];
        int direction = 0;//0:代表了向右1:代表了向下2:代表了向左,3:代表了向上
        int x=0,y=0;//现在所在的位置
        while (x>-1&&y>-1&&x<matrix.length&&y<matrix[0].length&&flag[x][y]!=1){  //下一方向的起始位置没有被遍历过
            switch (direction%4){
                case 0:
                    while(y<matrix[0].length&&flag[x][y] == 0){
                        result.add(matrix[x][y]);
                        flag[x][y] = 1;
                        y++;
                    }
                    y--;  //返回上一个没有越界的位置
                    x++; //开启下一个位置
                    break;
                case 1:
                    while(x<matrix.length&&flag[x][y] == 0){
                        result.add(matrix[x][y]);
                        flag[x][y] = 1;
                        x++;
                    }
                    x--;  //返回上一个没有越界的位置
                    y--; //开启下一个位置
                    break;
                case 2:
                    while (y>-1&&flag[x][y] == 0){
                        result.add(matrix[x][y]);
                        flag[x][y] = 1;
                        y--;
                    }
                    y++;
                    x--;
                    break;
                case 3:
                    while(x>-1&&flag[x][y] == 0){
                        result.add(matrix[x][y]);
                        flag[x][y] = 1;
                        x--;
                    }
                    x++;  //返回上一个没有越界的位置
                    y++; //开启下一个位置
                    break;
            }
            direction++;
        }
        return result;
上一篇下一篇

猜你喜欢

热点阅读