数组和矩阵

作者: Airycode | 来源:发表于2018-05-08 15:10 被阅读22次

    转圈打印矩阵
    [题目]
    给定一个整型矩阵matrix,请按照转圈的方式打印它
    例如:
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16
    打印结果为:1 2 3 4 8 12 16 15 14 13 9 5 6 7 11 10
    [要求]
    额外空间复杂度为O(1)
    [思路]
    如果你按照下标的方式控制什么时候换行就比较麻烦了,下面我们介绍一种矩阵的处理方式,该方式也是处理矩阵的一种思路,代码实现起来也比较简便。
    矩阵分圈处理:
    1:在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)就可以表示一个子矩阵。
    比如题目中的矩阵,当(tR,tC)=(0,0)和(dR,dC)=(3,3)表示的子矩阵是整个矩阵,这个矩阵的最外层为:
    1 2 3 4
    5 8
    9 12
    13 14 15 16
    当(tR,tC)=(0,0)和(dR,dC)=(3,3)时候,打印的结果是1,2,3,4,8,12,16,15,14,13,9,5
    2:接着我们改变tR,tC,dR,dC的值,让(tR,tC)=(1,1)和 (dR,dC)=(2,2)此时表示的子矩阵为:
    6 7
    10 11
    在把这个矩阵打印出来:6,7,11,10
    3:打印结束的条件是左上角的下标大于右下角的下标(左上角坐标跑到右下角坐标的右方或者下方)
    [代码实现]

    package 数组和矩阵;
    
    public class Main1 {
    
        public static void main(String[] args) {
            int [][]matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
            
            zhuanQuanPrint(matrix);
        }
    
        /**转圈打印*/
        private static void zhuanQuanPrint(int[][] matrix) {
            
            //定义左上角的坐标
            int tR = 0;
            int tC = 0;
            //定义右下角的坐标
            int dR=matrix.length-1;
            int dC=matrix[0].length-1;
            
            /**转圈打印*/
            while (tR<=dR || tC<=dC) {
                printEdage(matrix,tR++,tC++,dR--,dC--);
            }
            
        }
    
        /**转圈打印最外层*/
        private static void printEdage(int[][] matrix, int tR, int tC, int dR,
                int dC) {
            
            /**子矩阵只有一行*/
            if (tR == dR) {
                for (int i=tC;i<=dC;i++) {
                    System.out.print(matrix[tR][i]+" ");
                }
            } else if(tC==dC){/**子矩阵只有一列*/
                for (int i=tR;i<=dR;i++) {
                    System.out.print(matrix[i][tC]);
                }
            } else {//普通情况
                int curC = tC;
                int curR = tR;
                while (curC != dC) {
                    System.out.print(matrix[tR][curC]+" ");
                    curC++;
                }
                
                while (curR != dR) {
                    System.out.print(matrix[curR][dC]+" ");
                    curR++;
                }
                
                while (curC != tC) {
                    System.out.print(matrix[dR][curC]+" ");
                    curC--;
                }
                
                while (curR != tR) {
                    System.out.print(matrix[curR][tC]+" ");
                    curR--;
                }
                
            }
            
        }
        
    }
    
    

    2.将正方形矩阵顺时针转动90度
    [题目]
    给定一个NN的矩阵matrix,把这个矩阵调整成顺时针转动90度后的形式.
    例如:
    1 2 3 4
    5 6 7 8
    9 10 11 12
    13 14 15 16
    顺时针转动90度后为:
    13 9 5 1
    14 10 6 2
    15 11 7 3
    16 12 8 4
    [要求]
    额外空间复杂度为O(1)
    [思路]
    分圈处理方式:在矩阵中左上角和右下角就可以表示一个子矩阵,当(tR,tC)=(0,0)和(dR,dC)=(3,3)表示的矩阵是
    1 2 3 4
    5 8
    9 12
    13 14 15 16
    在这个矩阵中1,4,16,13为一组,然后1占据4的位置,4占据16的位置,16占据13的位置,13占据1的位置,一组就调整完,然后2,8,15,9为一组继续上述的调整,最后3,12,14,5为一组,当矩阵为4
    4的时候分成了3租就调整结束,如果子矩阵的大小是M*M,一共就有M-1组,分别进行占据调整就可以了。

    [代码实现]

    package 数组和矩阵;
    
    public class Main2 {
    
        public static void main(String[] args) {
            int [][]matrix = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,16}};
            
            rotatePrint(matrix);
            
            print(matrix);
        }
    
        private static void print(int[][] matrix) {
            for (int i=0;i<matrix.length;i++) {
                for (int j=0;j<matrix[0].length;j++) {
                    System.out.print(matrix[i][j]+" ");
                }
                System.out.println();
            }
            
        }
    
        /**矩阵顺时针旋转*/
        private static void rotatePrint(int[][] matrix) {
            
            /**左上角坐标*/
            int tC=0;
            int tR=0;
            /**右下角坐标*/
            int dC=matrix.length-1;
            int dR = matrix[0].length-1;
            
            /**旋转打印*/
            while (tR < dR) {
                rotateEdge(matrix,tC++,tR++,dC--,dR--);
            }
            
        }
    
        /**顺时针旋转*/
        private static void rotateEdge(int[][] matrix, int tC, int tR, int dC, int dR) {
            
            int times = dC-tC;//总的次数
            int temp=0;
            for (int i=0;i!=times;i++) {/**一次循环就是一次调整*/
                temp = matrix[tR][tC+i];//第一次1的位置为空,13填进去
                matrix[tR][tC+i] = matrix[dR-i][tC];//13为空
                matrix[dR-i][tC] = matrix[dR][dC-i];//16填13位置
                matrix[dR][dC-i] = matrix[tR+i][dC];//16为空4填
                matrix[tR+i][dC] = temp;
                
            }
            
        }
        
    }
    
    

    相关文章

      网友评论

        本文标题:数组和矩阵

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