Leetcode原题 -- 螺旋矩阵相关

发布时间 2023-10-21 17:11:47作者: 呵呵静

第一题:54. 螺旋矩阵

题目描述给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 :

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

解题思路:按层遍历,如图所示,找到规律后就差不多了

public List<Integer> spiralOrder(int[][] matrix) {
    int rowIndexMin = 0;
    int rowIndexMax = matrix.length - 1;
    int columnIndexMin = 0;
    int columnIndexMax = matrix[0].length - 1;
    List<Integer> result = new ArrayList<>();
    while (rowIndexMin <= rowIndexMax && columnIndexMin <= columnIndexMax) {
        // 1、 横着走,从左到右 -> 行坐标不变 && 列坐标++
        for (int j = columnIndexMin; j <= columnIndexMax; j++) {
            result.add(matrix[rowIndexMin][j]);
        }

        // 2、竖着走,从上到下 -> 行坐标++ && 列坐标不变
        for (int i = rowIndexMin + 1; i <= rowIndexMax; i++) {
            result.add(matrix[i][columnIndexMax]);
        }

        if (rowIndexMin < rowIndexMax && columnIndexMin < columnIndexMax) {
            // 3、横着走,从右到左 -> 行坐标不变 && 坐标--
            for (int j = columnIndexMax - 1; j > columnIndexMin; j--) {
                result.add(matrix[rowIndexMax][j]);
            }

            // 4、竖着走,从下到上 -> 行坐标-- && 坐标不变
            for (int i = rowIndexMax ; i > rowIndexMin; i--) {
                result.add(matrix[i][columnIndexMin]);
            }
        }
        // 循环完后列瘦一圈
        rowIndexMin++;
        rowIndexMax--;
        columnIndexMin++;
        columnIndexMax--;
    }
    return result;
}

第二题:59. 螺旋矩阵 II

题目描述给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。

示例 1:

输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]

示例 2:

输入:n = 1
输出:[[1]]

解题思路:这题和上面的题类似的,只不过结果和输入倒过来了,思路一样的

public static int[][] generateMatrix(int n) {
    int rowIndexMin = 0;
    int rowIndexMax = n - 1;
    int columnIndexMin = 0;
    int columnIndexMax = n - 1;
    int[][] result = new int[n][n];
    int source = 1;
    while (rowIndexMin <= rowIndexMax && columnIndexMin <= columnIndexMax) {
        // 1、 横着走,从左到右 -> 行坐标不变 && 列坐标++
        for (int j = columnIndexMin; j <= columnIndexMax; j++) {
            result[rowIndexMin][j] = source++;
        }

        // 2、竖着走,从上到下 -> 行坐标++ && 列坐标不变
        for (int i = rowIndexMin + 1; i <= rowIndexMax; i++) {
            result[i][columnIndexMax] = source++;
        }

        if (rowIndexMin < rowIndexMax && columnIndexMin < columnIndexMax) {
            // 3、横着走,从右到左 -> 行坐标不变 && 坐标--
            for (int j = columnIndexMax - 1; j > columnIndexMin; j--) {
                result[rowIndexMax][j] = source++;
            }

            // 4、竖着走,从下到上 -> 行坐标-- && 坐标不变
            for (int i = rowIndexMax ; i > rowIndexMin; i--) {
                result[i][columnIndexMin] = source++;
            }
        }
        // 循环完后列瘦一圈
        rowIndexMin++;
        rowIndexMax--;
        columnIndexMin++;
        columnIndexMax--;
    }
    return result;
}