力扣经典150题第三十五题:螺旋矩阵

目录

力扣经典150题第三十五题:螺旋矩阵

引言

本篇博客介绍了力扣经典150题中的第三十五题:螺旋矩阵。题目要求按照顺时针螺旋顺序遍历给定的二维矩阵,并返回所有元素的顺序列表。

题目详解

给定一个 m 行 n 列的矩阵 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]

解题思路

为了按照顺时针螺旋顺序遍历矩阵,我们可以模拟"层级遍历"的方式。具体步骤如下:

  1. 定义四个边界:上边界 top、下边界 bottom、左边界 left、右边界 right,初始值分别为 0、m-1、0、n-1。
  2. 根据当前边界依次向右、向下、向左、向上遍历矩阵,并将遍历结果存储到结果列表中。
  3. 每遍历完一个方向后,调整对应的边界,并判断是否需要继续遍历。
  4. 循环直至遍历完所有元素。

代码实现

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class SpiralMatrix {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return result;
        }
        
        int m = matrix.length;
        int n = matrix[0].length;
        int top = 0, bottom = m - 1, left = 0, right = n - 1;
        
        while (top <= bottom && left <= right) {
            // Traverse from left to right
            for (int i = left; i <= right; i++) {
                result.add(matrix[top][i]);
            }
            top++;
            
            // Traverse from top to bottom
            for (int i = top; i <= bottom; i++) {
                result.add(matrix[i][right]);
            }
            right--;
            
            if (top <= bottom) {
                // Traverse from right to left
                for (int i = right; i >= left; i--) {
                    result.add(matrix[bottom][i]);
                }
                bottom--;
            }
            
            if (left <= right) {
                // Traverse from bottom to top
                for (int i = bottom; i >= top; i--) {
                    result.add(matrix[i][left]);
                }
                left++;
            }
        }
        
        return result;
    }

    public static void main(String[] args) {
        SpiralMatrix solution = new SpiralMatrix();

        // 示例测试
        int[][] matrix1 = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        System.out.println("输入矩阵1:" + Arrays.deepToString(matrix1));
        System.out.println("螺旋顺序遍历结果:" + solution.spiralOrder(matrix1));

        int[][] matrix2 = {{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}};
        System.out.println("输入矩阵2:" + Arrays.deepToString(matrix2));
        System.out.println("螺旋顺序遍历结果:" + solution.spiralOrder(matrix2));
    }
}

示例演示

展示了两个不同规模的矩阵输入,并输出了按照顺时针螺旋顺序遍历后的结果。

复杂度分析

该解法的时间复杂度为 O(m*n),其中 m 是矩阵的行数,n 是矩阵

的列数。空间复杂度为 O(1),除了存储结果的列表外,没有使用额外的空间。

总结

本篇博客介绍了如何按照顺时针螺旋顺序遍历给定的矩阵,并给出了具体的解题思路和代码实现。希望这篇文章能够帮助你理解和掌握这道经典算法题目!

扩展阅读

这篇博客详细介绍了力扣经典150题中的第三十五题:螺旋矩阵,包括题目详解、解题思路、代码实现、示例演示、复杂度分析和总结。希望对你有所帮助!

相关推荐
AI进化营-智能译站4 小时前
ROS2 C++开发系列17-多线程驱动多传感器|chrono高精度计时实现机器人同步控制
java·c++·ai·机器人
Java成神之路-7 小时前
【LeetCode 刷题笔记】34. 在排序数组中查找元素的第一个和最后一个位置 | 二分查找经典刷题题解
算法·leetcode
qq_589568107 小时前
springbootweb案例,出现访问 http://localhost:8080/list 一直处于浏览器运转阶段
java·网络协议·http·list·springboot
JAVA面经实录9177 小时前
计算机基础(完整版·超详细可背诵)
java·linux·数据结构·算法
AC赳赳老秦8 小时前
知识产权辅助:用 OpenClaw 批量生成专利交底书 / 软著申请材料,自动校验格式与内容合规性
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
FYKJ_20108 小时前
springboot校园兼职平台--附源码02041
java·javascript·spring boot·python·eclipse·django·php
书源丶9 小时前
三十六、File 类与 IO 流基础——文件操作的「第一步」
java
AI人工智能+电脑小能手10 小时前
【大白话说Java面试题】【Java基础篇】第30题:JDK动态代理和CGLIB动态代理有什么区别
java·开发语言·后端·面试·代理模式
DFT计算杂谈10 小时前
wannier90 参数详解大全
java·前端·css·html·css3