LeetCode 热题 100 之 54.螺旋矩阵

LeetCode 热题 100 之 54.螺旋矩阵

解题思路(边界模拟法)

我们可以通过维护四个边界(上、下、左、右)来模拟顺时针螺旋遍历的过程:

  1. 从左到右遍历当前上边界的行,然后上边界向下移动。
  2. 从上到下遍历当前右边界的列,然后右边界向左移动。
  3. 如果上下边界仍有未遍历的行,则从右到左遍历当前下边界的行,然后下边界向上移动。
  4. 如果左右边界仍有未遍历的列,则从下到上遍历当前左边界的列,然后左边界向右移动。
  5. 重复以上步骤,直到所有边界交叉,遍历结束。

Java 代码实现

public class Solution { public List<Integer> spiralOrder(int[][] matrix) { List<Integer> res = new ArrayList<>(); if (matrix == null || matrix.length == 0) { return res; } int top = 0; int bottom = matrix.length - 1; int left = 0; int right = matrix[0].length - 1; while (top <= bottom && left <= right) { // 1. 从左到右遍历上边界 for (int j = left; j <= right; j++) { res.add(matrix[top][j]); } top++; // 2. 从上到下遍历右边界 for (int i = top; i <= bottom; i++) { res.add(matrix[i][right]); } right--; // 3. 如果还有行,从右到左遍历下边界 if (top <= bottom) { for (int j = right; j >= left; j--) { res.add(matrix[bottom][j]); } bottom--; } // 4. 如果还有列,从下到上遍历左边界 if (left <= right) { for (int i = bottom; i >= top; i--) { res.add(matrix[i][left]); } left++; } } return res; } } 

复杂度分析

  • 时间复杂度:O (mn),矩阵中的每个元素都被访问一次。
  • 空间复杂度:O (1),除了存储结果的列表外,我们只使用了常数级别的额外空间。

官方解法

class Solution { public List<Integer> spiralOrder(int[][] matrix) { // 1. 初始化结果列表,用于存储螺旋遍历的元素 List<Integer> order = new ArrayList<Integer>(); // 2. 边界校验:如果矩阵为空/行数为0/列数为0,直接返回空列表 if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return order; } // 3. 定义基础变量 int rows = matrix.length; // 矩阵的行数 int columns = matrix[0].length; // 矩阵的列数 boolean[][] visited = new boolean[rows][columns]; // 标记矩阵元素是否被访问过(避免重复遍历) int total = rows * columns; // 矩阵总元素数(遍历终止条件) int row = 0, column = 0; // 当前遍历的行、列坐标(初始在左上角) // 4. 定义四个移动方向:右(0,1)、下(1,0)、左(0,-1)、上(-1,0)(顺时针顺序) int[][] directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; int directionIndex = 0; // 当前方向的索引(初始为“右”) // 5. 遍历所有元素(循环total次) for (int i = 0; i < total; i++) { // 5.1 将当前元素加入结果列表,并标记为已访问 order.add(matrix[row][column]); visited[row][column] = true; // 5.2 计算下一个位置的坐标(按当前方向前进) int nextRow = row + directions[directionIndex][0]; int nextColumn = column + directions[directionIndex][1]; // 5.3 检查下一个位置是否合法:越界 或 已访问 → 需要切换方向 if (nextRow < 0 || nextRow >= rows || nextColumn < 0 || nextColumn >= columns || visited[nextRow][nextColumn]) { directionIndex = (directionIndex + 1) % 4; // 切换方向(取模4保证循环) } // 5.4 更新当前坐标(按新方向/原方向前进) row += directions[directionIndex][0]; column += directions[directionIndex][1]; } // 6. 返回遍历结果 return order; } }

扩展

一、核心应用场景

1. 图形 / 图像处理领域(最常见)
  • 场景:在图像编辑、计算机视觉中,经常需要按螺旋顺序处理像素(比如对图像局部区域做模糊、锐化、边缘检测,或提取特定区域的像素特征)。
    • 举例:
      • 对一张照片的某个矩形区域,从外到内螺旋式调整像素亮度 / 对比度,实现 “渐变晕影” 效果;
      • 医学影像(如 CT、MRI 切片)分析中,螺旋遍历病灶区域的像素,提取纹理特征辅助诊断。
  • 为什么用螺旋遍历:相比逐行 / 逐列遍历,螺旋遍历能更贴合 “从外围到核心” 的分析逻辑,比如先分析病灶边缘,再深入核心区域。
2. 数据可视化 / UI 交互
  • 场景:前端 / 移动端的可视化组件开发中,螺旋布局的图表、动画效果需要基于螺旋遍历的逻辑实现。
    • 举例:
      • 螺旋式排列的数字仪表盘、进度条(比如电商平台的 “销量螺旋增长” 可视化图表);
      • 游戏开发中,敌人从外围螺旋式向玩家角色移动的路径规划(本质是按螺旋顺序遍历二维地图坐标)。
3. 矩阵数据处理 / 算法题解(工程 + 面试)
  • 场景:后端数据处理中,对二维结构化数据(如表格、矩阵型传感器数据)做螺旋式读取 / 写入。
    • 举例:
      • 工业传感器阵列(如温度、压力传感器组成的二维网格),按螺旋顺序采集数据,确保 “先外围后核心” 的采样优先级;
      • 数据库中二维报表数据的导出 / 转换(比如将螺旋遍历的结果生成特定格式的报表)。
  • 面试价值:这是算法面试的经典题(LeetCode 54 题),掌握它能体现你对 “边界控制”“循环逻辑” 的理解,而这类边界处理能力是开发中处理复杂数据结构的基础(比如处理分页、多维数组分片)。
4. 硬件 / 嵌入式开发
  • 场景:对二维阵列硬件(如 LED 点阵屏、键盘矩阵)的驱动控制。
    • 举例:
      • LED 点阵屏实现螺旋式滚动显示文字 / 图案(比如从屏幕外围到中心逐步点亮像素);
      • 矩阵键盘的扫描策略(按螺旋顺序扫描按键,优化响应效率)。

二、实际应用示例(简化代码场景)

以 “LED 点阵屏螺旋点亮” 为例,核心逻辑复用螺旋遍历的边界控制思想:

// 模拟LED点阵屏(5x5),按螺旋顺序点亮像素(1=亮,0=灭) public class LedMatrix { public static void main(String[] args) { int[][] ledMatrix = new int[5][5]; // 初始全灭(0) spiralLight(ledMatrix); // 打印点亮后的点阵 for (int[] row : ledMatrix) { for (int pixel : row) { System.out.print(pixel + " "); } System.out.println(); } } // 螺旋点亮逻辑(复用原算法的边界控制) public static void spiralLight(int[][] matrix) { if (matrix == null || matrix.length == 0) return; int top = 0, bottom = matrix.length - 1; int left = 0, right = matrix[0].length - 1; int lightFlag = 1; // 标记是否点亮 while (top <= bottom && left <= right) { // 从左到右点亮上边界 for (int j = left; j <= right; j++) { matrix[top][j] = lightFlag; } top++; // 从上到下点亮右边界 for (int i = top; i <= bottom; i++) { matrix[i][right] = lightFlag; } right--; // 从右到左点亮下边界(判断是否有行) if (top <= bottom) { for (int j = right; j >= left; j--) { matrix[bottom][j] = lightFlag; } bottom--; } // 从下到上点亮左边界(判断是否有列) if (left <= right) { for (int i = bottom; i >= top; i--) { matrix[i][left] = lightFlag; } left++; } } } } 

输出效果(5x5 点阵全被螺旋式点亮为 1):

1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 

如果调整lightFlag为按遍历顺序递增(1、2、3...25),就能看到明显的螺旋数字排列,对应 LED 屏的螺旋显示效果。

总结

  1. 螺旋遍历矩阵的核心价值是按 “从外到内、顺时针” 的顺序处理二维结构数据,适配 “外围优先” 的业务逻辑;
  2. 实际应用集中在图形图像处理、数据可视化、硬件驱动等领域,同时也是算法能力的经典考察点;
  3. 其核心的 “边界收缩” 思想(top/bottom/left/right 控制)可迁移到各类二维数据的遍历场景(如分页处理、区域裁剪)。

Read more

【MCP AI Copilot考试通关宝典】:90%考生忽略的3个关键得分点

第一章:MCP AI Copilot考试概述 MCP AI Copilot考试是面向现代云平台开发者与人工智能工程实践者的一项专业能力认证,旨在评估考生在集成AI助手、自动化代码生成、智能运维及安全合规等方面的实际应用水平。该考试结合理论知识与实操技能,要求考生熟练掌握主流开发环境中的AI协作工具,尤其是基于Microsoft Azure平台的AI Copilot生态组件。 考试目标与适用人群 * 具备至少一年云开发或DevOps实践经验的工程师 * 熟悉AI辅助编程工具如GitHub Copilot、Azure AI Studio的开发者 * 希望验证其在自动化流程设计与AI集成方面能力的专业人士 核心技能考核范围 技能领域占比说明AI驱动的代码生成30%评估使用自然语言生成可靠代码的能力智能调试与优化25%考察AI辅助定位性能瓶颈与修复缺陷安全与合规检查20%识别AI生成代码中的潜在风险CI/CD集成AI流程25%实现AI模型在流水线中的自动部署 典型操作示例:启用AI Copilot插件 在Visual Studio Code中集成Copilot需执行

By Ne0inhk
2026年3月1日-阿里CoPaw开源炸场!百度云1分钱服务器秒变多平台AI个人助理

2026年3月1日-阿里CoPaw开源炸场!百度云1分钱服务器秒变多平台AI个人助理

1. 前言 在AI个人助理赛道竞争愈发激烈的今天,如何拥有一个真正"为你工作、与你成长"的AI助手成为了技术圈的热门话题。市面上的AI助手要么功能单一只能聊天,要么接入渠道有限只支持网页端,要么部署门槛极高需要专业运维知识,普通开发者想要拥有一个多平台、可扩展、支持记忆的私人AI助理一直是个难题。 还记得上个月我们那篇1分钱部署私人AI助手!百度云OpenClaw极速版,3分钟搞定零代码吗?当时百度智能云推出了0.01元抢购轻量应用服务器的活动,不少小伙伴都成功上车拿到了一台2核4G的云服务器。虽然那个1分钱活动已经结束了,但服务器还在手里呢!今天我们就要物尽其用,在这台百度云服务器上部署阿里刚开源的重磅项目——CoPaw(协同个人智能体工作台),让你的服务器从单一的OpenClaw升级为支持钉钉、飞书、QQ等多平台接入的全能AI个人助理。 这2天CoPaw非常火爆,话不多说,今天我们就在百度云轻量应用服务器上手把手教大家部署这个阿里开源的AI个人助理平台,体验和感受一下CoPaw"你的搭档小爪子"的强大能力。 2. 项目介绍 什么是CoPaw? CoPaw是阿里Age

By Ne0inhk

NPlayer完整使用指南:从入门到精通的开源视频播放器

NPlayer完整使用指南:从入门到精通的开源视频播放器 【免费下载链接】nplayer🚀 支持移动端、支持 SSR、支持直播,可以接入任何流媒体。高性能的弹幕系统。高度可定制,所有图标、主题色等都可以替换,并且提供了内置组件方便二次开发。无第三方运行时依赖。 项目地址: https://gitcode.com/gh_mirrors/np/nplayer NPlayer是一款功能强大的开源视频播放器,支持移动端、SSR、直播流媒体,拥有高性能弹幕系统和高度可定制化界面。无论你是开发者还是普通用户,都能轻松上手这款优秀的视频播放解决方案。🎬 为什么选择NPlayer? NPlayer具有多项独特优势,让它成为视频播放领域的佼佼者: 🚀 零依赖设计:无需任何第三方运行时库,保证了项目的安全性和稳定性 📱 全平台兼容:完美支持PC、移动端,甚至兼容IE11浏览器 🎯 直播流支持:原生支持HLS、DASH、FLV等主流直播流媒体格式 💬 高性能弹幕:内置专业的弹幕系统,支持丰富的弹幕自定义选项 🎨 高度可定制:所有图标、主题色、

By Ne0inhk
GitHub 热点项目深度报告(prompts.chat (fka Awesome ChatGPT Prompts))

GitHub 热点项目深度报告(prompts.chat (fka Awesome ChatGPT Prompts))

📊 项目概览 指标 数值 GitHub Stars 151,177 ⭐ 项目地址 f/prompts.chat 官方网站 https://prompts.chat 许可证 CC0 1.0 (公共领域) 主要语言 TypeScript/JavaScript 创建时间 2022 年 12 月 (首个提示词库) GitHub 荣誉 Staff Pick 🎯 项目介绍 是什么 prompts.chat 是全球最大的开源 AI 提示词库,前身为 “Awesome ChatGPT Prompts”。它是一个 curated 的提示词集合,适用于 ChatGPT、Claude、

By Ne0inhk