Leetcode54/59-螺旋矩阵
矩阵之螺旋矩阵
总体思路:
- 注意遍历顺序 每次遍历一圈时候不要多加元素
Leetcode54螺旋矩阵
- 给你一个 m行n列的矩阵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,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的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;
    }
 
                    
                     
                    
                 
                    
                


 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号