LeetCode热题100--54.螺旋矩阵--中等

1. 题目

给你一个 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]

2. 题解

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        List<Integer> result = new ArrayList<>();

        if(matrix == null || matrix.length == 0 || matrix[0].length == 0){
            return result;
        }

        int top = 0, bottom = matrix.length - 1; //上下边界
        int left = 0, right = matrix[0].length - 1; //左右边界

        while(top <= bottom && left <= right){
            //从左到右遍历当前的上边界
            for(int i = left; i <= right; i++){
                result.add(matrix[top][i]);
            }
            top++; //上边界缩小

            //从上到下遍历当前右边界
            for(int i = top; i <= bottom; i++){
                result.add(matrix[i][right]);
            }
            right--; //右边界缩小

            //从右到左遍历当前下边界(需要检查上下边界是否相交)
            if(top <= bottom){
                for(int i = right; i >= left; i--){
                    result.add(matrix[bottom][i]);
                }
                bottom--; //下边界缩小
            }
            //从下往上遍历当前左边界(需要检查左右边界是否相交)
            if(left <= right){
                for(int i = bottom; i>=top; i--){
                    result.add(matrix[i][left]);
                }
                left++; //左边界缩小
            }
        }
        return result;
    }
    
}

3. 解析

  1. List result = new ArrayList<>();

    初始化一个空列表来存储结果,因为我们从左上角开始以螺旋的顺序遍历矩阵。

  2. if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return result;

    如果输入的矩阵为空或者没有元素,则返回已经初始化的空列表。

  3. int top = 0, bottom = matrix.length - 1; int left = 0, right = matrix[0].length - 1;

    定义四个变量来表示矩阵的边界。顶部、底部、左侧和右侧分别对应行号和列号,用于跟踪遍历过程中的位置。

  4. while(top <= bottom && left <= right) { ... }

    这段代码使用循环来以螺旋的顺序访问矩阵,从外到内进行遍历。条件是边界没有相交(即,我们还没有完全遍历完整个矩阵)。

  5. for(int i = left; i <= right; i++) { result.add(matrix[top][i]); } top++;

    从顶部行的左侧到右侧的元素进行循环遍历,并将它们添加到结果列表中。然后,上边界向下移动一步(因为我们已经访问了这一行中的所有元素)。

  6. for(int i = top; i <= bottom; i++) { result.add(matrix[i][right]); } right--;

    从右侧列的顶部到底部的元素进行循环遍历,并将它们添加到结果列表中。然后,有边界向左移动一步(因为我们已经访问了这一列中的所有元素)。

  7. if(top <= bottom) { for(int i = right; i >= left; i--) { result.add(matrix[bottom][i]); } bottom--; }

    如果顶部和底部没有相交,说明我们还没有遍历完最外层的矩阵。这段代码从右侧行的底部到底部的元素进行循环遍历(向后移动)并将它们添加到结果列表中。然后,下边界向上移动一步。

  8. if(left <= right) { for(int i = bottom; i >= top; i--) { result.add(matrix[i][left]); } left++; }

    如果左侧和右侧没有相交,说明我们还没有遍历完最外层的矩阵。这段代码从底部行的左侧到顶部的元素进行循环遍历(向下移动)并将它们添加到结果列表中。然后,左边界向右移动一步。

  9. return result;

    在访问完整个矩阵后,返回最终的结果列表。

相关推荐
CoovallyAIHub1 分钟前
避开算力坑!无人机桥梁检测场景下YOLO模型选型指南
深度学习·算法·计算机视觉
YouQian7725 分钟前
问题 C: 字符串匹配
c语言·数据结构·算法
yanxing.D11 分钟前
408——数据结构(第二章 线性表)
数据结构·算法
艾莉丝努力练剑40 分钟前
【LeetCode&数据结构】二叉树的应用(二)——二叉树的前序遍历问题、二叉树的中序遍历问题、二叉树的后序遍历问题详解
c语言·开发语言·数据结构·学习·算法·leetcode·链表
YuTaoShao1 小时前
【LeetCode 热题 100】51. N 皇后——回溯
java·算法·leetcode·职场和发展
1 小时前
3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
算法·3d·unity·c#·游戏引擎·sat
Tony沈哲1 小时前
OpenCV 图像调色优化实录:基于图像金字塔的 RAW / HEIC 文件加载与调色实践
opencv·算法
我就是全世界2 小时前
Faiss中L2欧式距离与余弦相似度:究竟该如何选择?
算法·faiss
boyedu2 小时前
比特币运行机制全解析:区块链、共识算法与数字黄金的未来挑战
算法·区块链·共识算法·数字货币·加密货币
KarrySmile2 小时前
Day04–链表–24. 两两交换链表中的节点,19. 删除链表的倒数第 N 个结点,面试题 02.07. 链表相交,142. 环形链表 II
算法·链表·面试·双指针法·虚拟头结点·环形链表