牛客初级班——矩阵

目前正在学习的视频,把视频里讲的题实现的思路和遇到的问题记录一下

矩阵问题

此类问题一般是矩阵的花式打印,只要注意不要纠结于位置的变化,宏观思考就可以得出简洁的代码

转圈打印矩阵

牛客初级班——矩阵_第1张图片
这个问题不要想着索引怎么变化。
比如打印最外圈一行 到 最右面的列结束,打印最外圈一列到最下面的行结束
所以说只要记录左上角和右下角两个点就能控制打印一圈矩阵,不用考虑变化问题了
特殊情况要考虑只有一行和一列的情况

public static void printEdge(int[][] matrix,int row1,int col1,int row2,int col2){
        if(row1 == row2){
            for(int i=col1;i<=col2;i++){
                System.out.print(matrix[row1][i]+",");
            }
        }else if(col1==col2){
            for(int i=row1;i<=row2;i++){
                System.out.print(matrix[i][col1]+",");
            }
        }else {
            int cindex = col1;
            int rindex = row1;

            while (cindex < col2) {
                System.out.print(matrix[row1][cindex++] + ",");
            }
            while (rindex < row2) {
                System.out.print(matrix[rindex++][col2] + ",");
            }
            while (cindex > col1) {
                System.out.print(matrix[row2][cindex--] + ",");
            }
            while (rindex > row1) {
                System.out.print(matrix[rindex--][col1] + ",");
            }
        }
    }

    public static void main(String[] args) {
//        int[][] matrix = new int[][]{
//                {1,2,3,4},
//                {5,6,7,8},
//                {9,10,11,12},
//                {13,14,15,16}
//        };
        int[][] matrix = new int[][]{
                {1},
                {5},
                {9},
                {13}
        };
        int row1 = 0;
        int col1 = 0;
        int row2 = matrix.length-1;
        int col2 = matrix[0].length-1;
        while(row1<=row2&&col1<=col2){
            printEdge(matrix,row1++,col1++,row2--,col2--);
        }
    }

之字型打印矩阵

牛客初级班——矩阵_第2张图片
这个题目可以确定一个对角线然后每次打印对角线上的元素就可以,外部循环来控制对角线两端的元素变化。
上面的元素先往右面跑,跑不动,再跑到下面,左侧的元素先往下跑,然后往右跑。
然后布尔类型控制从上面往下面打印还是从下面往上面打印

public static void printMatrix(int[][] matrix){
        int row1 = 0,row2=0,col1 = 0,col2=0;
        boolean flag = true;
        while(row1!=matrix.length){
            printLevel(matrix,row1,col1,row2,col2,flag);
            row1 = col1==matrix[0].length-1 ? row1+1 : row1;
            col1 = col1==matrix[0].length-1 ? col1 : col1+1;
			//因为顺序可能会导致出错的地方
            col2 = row2==matrix.length-1 ? col2+1 : col2;
            row2 = row2==matrix.length-1 ? row2 : row2+1;
            flag = !flag;
        }
    }

    public static void printLevel(int[][] matrix,int row1,int col1,int row2,int col2,boolean fromlast){
        if(fromlast){
            while(row2!=row1-1){
                System.out.print(matrix[row2--][col2++]+",");
            }
        }else{
            while(row1!=row2+1){
                System.out.print(matrix[row1++][col1--]+",");
            }
        }
    }

    public static void main(String[] args) {
        int[][] matrix = new int[][]{
                {1  , 2  , 3 ,  4},
                {5  , 6 ,  7 ,  8},
                {9 , 10 , 11 , 12}
        };
        printMatrix(matrix);
    }

容易出错的点

上面的代码,在控制对角线的移动时,如果row和col变化的顺序不正确的话可能会导致有的地方没打印到 比如说左侧行满了 但是接下来判断列了 列增加就会导致 row 2 0这个位置被跳过直接来到 row 2 col 1

在排好序的矩阵中找到一个数

牛客初级班——矩阵_第3张图片
如果要遍历每个元素找到K,时间复杂度为O(N*M)
要利用这个矩阵的性质 排好序 那么就可以排除一些数,从右上角开始,
如果K比它大那么就往下找,因为左面都是比它小的元素,如果K比他小就开始往左找
这样最大复杂度为O(N+M)

public class FindNumInSortedMatrix {
    public static boolean isKInMatrix(int[][] matrix,int K){
        int ri = 0;
        int ci = matrix[0].length-1;

        while(ri=0){
            if(K>matrix[ri][ci]){
                ri++;
            }else if(K

你可能感兴趣的:(【校招准备】牛客算法视频,算法,矩阵)