算法练习题17——leetcode54螺旋矩阵

news2025/1/8 4:21:40

题目描述

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

 代码

import java.util.*;

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        // 用于存储螺旋顺序遍历的结果
        List<Integer> result = new ArrayList<>();
        
        // 如果矩阵为空,直接返回空的结果列表
        if (matrix == null || matrix.length == 0) return result;

        // 获取矩阵的行数 m 和列数 n
        int m = matrix.length;      // 行数
        int n = matrix[0].length;   // 列数
        
        // 初始化四个边界,用于控制螺旋遍历的范围
        int top = 0;                // 上边界
        int bottom = m - 1;         // 下边界
        int left = 0;               // 左边界
        int right = n - 1;          // 右边界
        
        // 当上、下、左、右边界没有相互交错时,继续遍历
        while (top <= bottom && left <= right) {
            // 1. 从左到右遍历当前的上边界
            for (int i = left; i <= right; i++) {
                result.add(matrix[top][i]);  // 添加当前上边界的元素
            }
            top++;  // 上边界向下收缩一行,表示这一行已经处理完

            // 2. 从上到下遍历当前的右边界
            for (int i = top; i <= bottom; i++) {
                result.add(matrix[i][right]);  // 添加当前右边界的元素
            }
            right--;  // 右边界向左收缩一列,表示这一列已经处理完

            // 3. 从右到左遍历当前的下边界(仅当 top <= bottom 时)
            //    这里很重要!因为我们已经处理了上边界并将其收缩,
            //    所以在遍历下边界之前,需要确认是否还有剩余的行待遍历。
            if (top <= bottom) {
                for (int i = right; i >= left; i--) {
                    result.add(matrix[bottom][i]);  // 添加当前下边界的元素
                }
                bottom--;  // 下边界向上收缩一行,表示这一行已经处理完
            }

            // 4. 从下到上遍历当前的左边界(仅当 left <= right 时)
            //    这里同样很重要!因为我们已经处理了右边界并将其收缩,
            //    所以在遍历左边界之前,需要确认是否还有剩余的列待遍历。
            if (left <= right) {
                for (int i = bottom; i >= top; i--) {
                    result.add(matrix[i][left]);  // 添加当前左边界的元素
                }
                left++;  // 左边界向右收缩一列,表示这一列已经处理完
            }
        }
        
        // 返回螺旋顺序遍历的结果列表
        return result;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2112930.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神经网络训练不起来怎么办(零)| General Guidance

摘要&#xff1a;模型性能不理想时&#xff0c;如何判断 Model Bias&#xff0c; Optimization&#xff0c; Overfitting 等问题&#xff0c;并以此着手优化模型。在这个分析过程中&#xff0c;我们可以对Function Set&#xff0c;模型弹性有直观的理解。关键词&#xff1a;模型…

SnapGene 2.3.2软件下载安装教程百度网盘分享链接地址

SnapGene简介&#xff1a;SnapGene 2.3.2软件下载安装教程百度网盘分享链接地址&#xff0c;SnapGene 是一款超厉害的分子生物学软件。它最初由美国公司开发&#xff0c;后来换了东家。 这款软件功能多样&#xff0c;在序列编辑分析方面表现出色&#xff0c;能轻松搞定 DNA 序列…

Android Dialog:Dialog和DialogFragment的区别?DialogFragment如何使用?源码解析

目录 一、Dialog和DialogFragment的区别 Android在DialogFragment推出后&#xff0c;就已经不推荐继续使用Dialog&#xff0c;可替换为DialogFragment&#xff1a; 更好的生命周期管理&#xff1a;DialogFragment能够自动处理Activity的生命周期事件&#xff0c;确保对话框在…

Python 从入门到实战9(集合)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了python 中字典的定义及相关操作。今天…

模型训练套路(一)

一、训练完整使用网络模型 import torch import torchvision from torch import nn from torch.utils.data import DataLoaderfrom model1 import* # 此处的引用为此文在实现过程中所解决的问题 train_data torchvision.datasets.CIFAR10(root "../data", trainT…

63、Python之函数高级:装饰器缓存实战,优化递归函数的性能

引言 通过前面的文章&#xff0c;我们已经掌握了Python中常用的装饰器的使用技巧&#xff0c;这篇文章中&#xff0c;我们通过一个装饰器的实战案例&#xff0c;来进一步加深对装饰器的适用场景的理解。 本文的主要内容有&#xff1a; 1、递归函数 2、递归实现斐波那契数列…

AWTK HTML View 控件更新

AWTK HTML View 控件基于 Lite HTML 实现&#xff0c;从最初的版本开始&#xff0c;3 年多过去了&#xff0c;Lite HTML 做了大量的更新&#xff0c;最近抽空将 AWTK HTML View 控件适配到最新版本的 Lite HTML&#xff0c;欢迎大家使用。 AWTK HTML View 控件。HTML View 控件…

SAP B1 基础实操 - 用户定义字段 (UDF)

目录 一、功能介绍 1. 使用场景 2. 操作逻辑 3. 常用定义部分 3.1 主数据 3.2 营销单据 4. 字段设置表单 4.1 字段基础信息 4.2 不同类详细设置 4.3 默认值/必填 二、案例 1 要求 2 操作步骤 一、功能介绍 1. 使用场景 在实施过程中&#xff0c;经常会碰见用户需…

Qt线程使用

嗨嗨嗨&#xff0c;今天又学到了新的知识——线程&#xff0c;这个玩意在项目中使用的频率是非常高的&#xff0c;毕竟电脑的主线程就那么一个&#xff0c;那么这也就是我们为啥要学习线程的原因。比如说&#xff0c;我们们的游戏&#xff0c;如果我们的游戏界面显示的同时我们…

【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】

奥迪A8提车交车仪式AE模板制作过程软件生成器素材 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】奥迪A8提车交车仪式AE模板修改文字软件生成器教程特效素材【AE模板】 生日视频制作步骤&#xff1a; 安装AE软件 下载AE模板 把AE模板导入AE软件 修改图片…

PD快充协议方案 及应用场景

快充协议诱骗原理主要依赖于快充协议芯片与供电端&#xff08;如PD充电器&#xff09;之间的握手通信&#xff0c;以申请所需要的电压与电流&#xff0c;确保充电过程安全、快速且高效。这种芯片通过内置的通讯模块与供电端通信&#xff0c;根据设备的实际需求调整输出电压和电…

大路灯护眼灯有必要吗安全吗?性价比高落地护眼灯推荐

大路灯护眼灯有必要吗安全吗&#xff1f;近几年来&#xff0c;随着生活节奏的加快&#xff0c;目前青少年的近视率呈现一个直线上升的趋势&#xff0c;其中占比达到了70%以上&#xff0c;并且最令人意外的是小学生竟然也占着比较大的比重&#xff0c;这一系列的数据不仅表明着近…

苍穹外卖学习笔记(一)

文章目录 开发环境搭建一. 前端环境搭建二. 后端环境搭建1.进入idea项目2.提交git仓库(推送github远程仓库)3.数据库环境搭建4.前后端联调(在源代码中项目已经实现登录功能)nginx反向代理好处: 三. 完善登录功能(md5加密存储)1.首先打开pojo模块中实体类的employee&#xff0c;…

[STL --stack_queue详解]stack、queue,deque,priority_queue,容器适配器

stack stack介绍 1、stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行元素的插入与提取操作。 2、stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并提供…

原理图库和PCB库的命名规范及创建封装、使用封装管理器

原理图库 命名规范 原理图中元件值标注规则 注&#xff1a;元件值&#xff08;Component Value&#xff09;就是元件最主要的特征对应的值。 Component value. Most analog components have a value that must be specified by this field (e.g., 2.7 kΩ). Additional disti…

c++数据结构之队列

目录 一、队列的含义 1.队列的使用 2.队列的结构 二、顺序队列的实现 1.队列的定义 2.队列的初始化 3.清空对列 4.队列是否为空 5.获取队列的长度 6.获取头元素的值 7.入队列 8.出队列 9.遍历队列中的值 10.总代码 11.打印结果 三、链表队列的实现 1.队列的…

【Hot100】LeetCode—347. 前 K 个高频元素

目录 1- 思路自定义Node结点 哈希表实现 2- 实现⭐347. 前 K 个高频元素——题解思路 3- ACM实现 原题连接&#xff1a;347. 前 K 个高频元素 1- 思路 自定义Node结点 哈希表实现 ① 自定义 Node 结点&#xff1a; 自定义 Node 结点中有 value 和 cnt 字段&#xff0c;其中…

力扣接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…

html css网页制作

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; HTML 和 CSS 是制作网页的基础。HTML 用于定义网页的结构和内容&#xff0c;CSS 用于设计网页的样式和布局。以下是一个详细的网页制作成品教程&#xff0c;包括 HTML 和 CSS 的基础知识&#xff0c;及如何…

MySQL基础(7)- 多表查询

目录 一、笛卡尔积的错误与正确的多表查询 1.出现笛卡尔积错误 2.正确的多表查询&#xff1a;需要有连接条件 3.查询多个表中都存在的字段 4.SELECT和WHERE中使用表的别名 二、等值连接vs非等值连接、自连接vs非自连接 1.等值连接 vs 非等值连接 2.自连接 vs 非自连…