LeetCode -- 矩阵系列

322 阅读2分钟

最近很长时间都没有更新文章了,这是因为最近在find work,所以大多数时间都是在复习,刷题响应的就会变少了。

来看一下今天的问题,给你提供矩阵的长和宽,构建一个蛇形矩阵。

蛇形矩阵

如下:

输入:

3*3

输出:

1 6 7 2 5 8 3 4 9

image.png

这个其实还算简单,我们每次只需要循环一列即可。

代码如下:


public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String s = scanner.nextLine();
    String[] strs = s.split("/*");
    // 因为输入的是自然数,且小于整形最大值
    int rowNum = Integer.parseInt(strs[0]);
    int colNum = Integer.parseInt(strs[2]);
    // 构建
    buildSnackMatrix(rowNum, colNum);
}
/**
 * 构建蛇形矩阵
 * @param rowNum 行数
 * @param colNum 列数
 * @return snackMatrix 二维矩阵
 */
private static int[][] buildSnackMatrix(int rowNum, int colNum) {
    int[][] snackMatrix = new int[rowNum][colNum];

    int index = 1;
    for (int i = 0; i < colNum; i++) {
        if (i % 2 == 0) {
            for (int j = 0; j < rowNum; j++) {
                snackMatrix[j][i] = index++;
            }
        } else {
            for (int j = rowNum - 1; j >= 0; j--) {
                snackMatrix[j][i] = index++;
            }
        }
    }

    for (int[] ints : snackMatrix) {
        StringBuilder sb = new StringBuilder(colNum * 2);
        for (int anInt : ints) {
            sb.append(anInt).append(",");
        }
        // 去除最后一个 ,
        System.out.println(sb.substring(0, sb.length() - 1));
    }
    return snackMatrix;
}

螺旋输出矩阵

先来一个简单的练练手,给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。

输入:

[[1,2,3],[4,5,6],[7,8,9]]

输出:

[1,2,3,6,9,8,7,4,5]

这道题说难不是很难,说简单但是却很绕。

思路其实很简单,我们记录下矩阵的长和宽,记为top(0),bottom(m-1),left(0),right(n-1)。

然后我们在将第一行放入数组后,可以想象成将矩阵的顶给剪掉了,所以top + 1

然后将最后一列放入数组,可以想象成将矩阵的右侧给剪掉了,所以right - 1

然后将最后一行放入数组,可以想象将矩阵最下面给剪掉,所以bottom - 1

然后将最左侧放入数组,同理left + 1

所以代码如下,

public ArrayList<Integer> spiralOrder(int[][] matrix) {
    if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
        return new ArrayList<>();
    }
    int height = matrix.length;
    int length = matrix[0].length;

    return getCircleMatrix(matrix,length,height);
}

public ArrayList<Integer> getCircleMatrix(int[][] matrix,int length,int height) {
    int top = 0;
    int left = 0;
    int bottom = height - 1;
    int right = length - 1;
    // 最外层开始
    ArrayList<Integer> rt = new ArrayList<>(length * height);
    int index = 0;
    while(top <= bottom && left <= right) {
        for(int i = left; i <= right; i++) {
            rt.add(matrix[top][i]);
        }
        top++;
        for(int i = top; i <= bottom; i++) {
            rt.add(matrix[i][right]);
        }
        right--;
        if(top <= bottom && left <= right) {
            for(int i = right; i >= left; i--) {
                rt.add(matrix[bottom][i]);
            }
            bottom--;
            for(int i = bottom; i >= top; i--) {
                rt.add(matrix[i][left]);
            }
            left++;
        }
    }
    return rt;
}

螺旋构建矩阵

螺旋构建矩阵其实本质上和螺旋输出矩阵是一样的。

如果你理解了上面输出螺旋矩阵的话,这个对你来说不是问题的,这个比构建蛇形矩阵就难了一点点。

直接上代码

/**
 * 构建螺旋矩阵
 * @param rowNum 行数
 * @param colNum 列数
 * @return spiralMatrix 二维数组
 */
private static int[][] buildSpiralMatrix(int rowNum, int colNum) {
    int[][] spiralMatrix = new int[rowNum][colNum];
    // 从1开始累加
    int index = 1;

    // 左上到右下
    int top = 0;
    int bottom = rowNum - 1;
    int left = 0;
    int right = colNum - 1;

    while (top <= bottom && left <= right) {
        for (int i = left; i <= right; i++) {
            spiralMatrix[top][i] = index++;
        }
        top++;
        for (int i = top; i <= bottom; i++) {
            spiralMatrix[i][right] = index++;
        }
        right--;
        if(top <= bottom && left <= right) {
            for (int i = right; i >= left; i--) {
                spiralMatrix[bottom][i] = index++;
            }
            bottom--;
            for (int i = bottom; i >= top; i--) {
                spiralMatrix[i][left] = index++;
            }
            left++;
        }
    }
    for (int[] ints : spiralMatrix) {
        StringBuilder sb = new StringBuilder(colNum * 2);
        for (int anInt : ints) {
            sb.append(anInt).append(",");
        }
        System.out.println(sb.substring(0, sb.length() - 1));
    }
    return spiralMatrix;
}