54.螺旋矩阵


题目:54.螺旋矩阵

给你一个mn列的矩阵matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。

  • 示例 1:

螺旋矩阵

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

螺旋矩阵

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
  • 提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

思路

  1. 初始化变量:
    • top 表示上边界,初始化为 0
    • bottom 表示下边界,初始化为 matrix.length - 1
    • left 表示左边界,初始化为 0
    • right 表示右边界,初始化为 matrix[0].length - 1
    • total 表示矩阵中的总元素数量。
  2. 螺旋遍历:
    • 使用 while (total > 0) 循环控制遍历,当添加到结果列表中的元素数量达到总元素数量时结束遍历。
    • 从左到右遍历顶边,并将元素添加到结果列表中,同时total-1
    • 从上到下遍历右边,并将元素添加到结果列表中,同时total-1
    • 从右到左遍历底边,并将元素添加到结果列表中,同时total-1
    • 从下到上遍历左边,并将元素添加到结果列表中,同时total-1
  3. 返回结果:
    • 返回包含所有按螺旋顺序遍历的元素的列表。
  • 时间复杂度:O(mn)
  • 空间复杂度:O(mn)

代码

public List<Integer> spiralOrder(int[][] matrix) {
    List<Integer> result = new LinkedList<>();
    int left = 0;
    int right = matrix[0].length - 1;
    int top = 0;
    int bottom = matrix.length - 1;
    // 矩阵中的总元素数量
    int total = matrix[0].length * matrix.length;
    while (total > 0) {
        // 从左到右遍历顶边
        for (int i = left; i <= right && total > 0; i++) {
            result.add(matrix[top][i]);
            total--;
        }
        // 向下移动顶边界
        top++;
        // 从上到下遍历右边
        for (int i = top; i <= bottom && total > 0; i++) {
            result.add(matrix[i][right]);
            total--;
        }
        // 向左移动右边界
        right--;
        // 从右到左遍历底边
        for (int i = right; i >= left && total > 0; i--) {
            result.add(matrix[bottom][i]);
            total--;
        }
        // 向上移动底边界
        bottom--;
        // 从下到上遍历左边
        for (int i = bottom; i >= top && total > 0; i--) {
            result.add(matrix[i][left]);
            total--;
        }
        // 向右移动左边界
        left++;
    }
    return result;
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录