美文网首页
螺旋矩阵

螺旋矩阵

作者: 最困惑的时候就是能成长的时候 | 来源:发表于2019-04-09 13:35 被阅读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;
    

    相关文章

      网友评论

          本文标题:螺旋矩阵

          本文链接:https://www.haomeiwen.com/subject/ycfbiqtx.html