1. 程式人生 > 其它 >Leetcode刷題之螺旋矩陣

Leetcode刷題之螺旋矩陣

矩陣之螺旋矩陣

總體思路:

  • 注意遍歷順序 每次遍歷一圈時候不要多加元素

Leetcode54螺旋矩陣

  • 給你一個 mn 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
    public List<Integer> spiralOrder(int[][] matrix) {
        LinkedList<Integer> res=new LinkedList<>();

        int num=matrix.length*matrix[0].length;//總元素個數
        int top=0;
        int bottom=matrix.length-1;
        int left=0;
        int right=matrix[0].length-1;
        int offset=1;//偏移量

        while(num>=1){
            //從左到右 包括上面全部資料
            for(int i=left;i<=right && num>=1;i++){
                res.add(matrix[top][i]);
                num--;
            }
            //從上到下 最上面元素不包括
            for(int i=top+offset;i<=bottom && num>=1;i++){
                res.add(matrix[i][right]);
                num--;
            }
            //從右到左 最右邊元素不包括
            for(int i=right-offset;i>=left && num>=1;i--){
                res.add(matrix[bottom][i]);
                num--;
            }
            //從下到上  最上面和最下面元素不包括
            for(int i=bottom-offset;i>=top+offset && num>=1;i--){
                res.add(matrix[i][left]);
                num--;
            }
            top++;
            bottom--;
            left++;
            right--;
        }

        return res;
    }
  • 我採用的是下面這種迴圈遍歷方式

  • 為了對稱 也完全可以採取以下遍歷方式

  • 但是採用第二種方式 要對最後一行陣列進行單獨處理(因為無法進入任何一次之前的迴圈)

  • 而採用第一種遍歷方式的話 最後一行就不需要特殊處理啦

Leetcode59螺旋矩陣二

  • 給你一個正整數 n ,生成一個包含 1n2 所有元素,且元素按順時針順序螺旋排列的 n x n 正方形矩陣 matrix
 public int[][] generateMatrix(int n) {
        int[][] res=new int[n][n];

        int num=1;
        int target=n*n;
        int top=0;
        int bottom=n-1;
        int left=0;
        int right=n-1;
        int offset=1;//偏移量

        while(num<=target){
             //從左到右 包括上面全部資料
            for(int i=left;i<=right && num<=target;i++){
                res[top][i]=num;
                num++;
            }
            //從上到下 最上面元素不包括
            for(int i=top+offset;i<=bottom && num<=target;i++){
                res[i][right]=num;
                num++;
            }
            //從右到左 最右邊元素不包括
            for(int i=right-offset;i>=left && num<=target;i--){
                res[bottom][i]=num;
                num++;
            }
            //從下到上  最上面和最下面元素不包括
            for(int i=bottom-offset;i>=top+offset && num<=target;i--){
                res[i][left]=num;
                num++;
            }
            top++;
            bottom--;
            left++;
            right--;
        }
        return res;
    }
  • 方式二 採用上面第二個圖的對稱方式來遍歷
 public int[][] generateMatrix(int n) {
        int[][] res=new int[n][n];

        //迴圈次數
        int loop=n/2;

        //迴圈起始位置
        int loopx=0;
        int loopy=0;

        //偏移量
        int offset=1;

        //填充數字
        int count=1;

        //開始迴圈
        while(loop>0){
            int i=loopx;
            int j=loopy;

            //從左到右
            for(;j<loopy+n-offset;j++){
                res[i][j]=count++;
            }

            //從上到下
            for(;i<loopx+n-offset;i++){
                res[i][j]=count++;
            }

            //從右到左
            for(;j>loopy;j--){
                res[i][j]=count++;
            }

            //從下到少年宮
            for(;i>loopx;i--){
                res[i][j]=count++;
            }

            //一次迴圈結束
            loop--;
            loopx+=1;
            loopy+=1;
            offset+=2;
        }

        //奇數特殊處理
        int mid=n/2;
        if(n%2==1){
            res[mid][mid]=count++;
        }

        return res;
    }