当前位置: 首页 > ai >正文

【Hot100】54. 螺旋矩阵

目录

  • 引言
  • 螺旋矩阵
    • 我的解题
    • 代码优化

请添加图片描述

  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:算法专栏
  • 💥 标题:【Hot100】54. 螺旋矩阵
  • ❣️ 寄语:书到用时方恨少,事非经过不知难!

引言

螺旋矩阵

  • 🎈 题目链接:https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&envId=top-100-liked
  • 🎈 做题状态:

我的解题

虽然写出来了,但是代码也写的太丑陋了,感觉逻辑不清晰。但是其实我看了下官方题解,我的这个代码也不算是很复杂,虽然内容多,但是其实还是好理解的。

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {if (matrix.size() == 0) return {};vector<int> res;                // 记录结果int row = matrix.size();        // 记录行边界int col = matrix[0].size();     // 记录列边界int n = row * col;              // 数组总大小int i = 0;int j = 0;            // 遍历起始点// 记录当前矩阵的四个边界值int up = 0; int down = matrix.size();int right = matrix[0].size();int left = 0;cout << "n = " << n << endl;while(res.size() < n){// 右for(;j < right ;++j){//cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;--j;++i;++up;   // 上边界下移一位// 下for(;i < down ;++i){//cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;--i;--j;--right;    // 右边界左移一位// 左for(; j >= left;--j){cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;++j;--i;--down;     // 下边界上移一位// 上for(; i >= up;--i){//cout << "i = " << i << "; j = " << j << "; matrix[i][j] = " << matrix[i][j] << endl;res.push_back(matrix[i][j]);}if (res.size() == n) break;++i;++j;++left;     // 左边界右移一位}return res;}
};

代码优化

以下是优化后的代码,通过维护四个边界并使用更清晰的循环结构来简化逻辑:

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> res;if (matrix.empty()) return res;int top = 0, bottom = matrix.size() - 1;int left = 0, right = matrix[0].size() - 1;while (top <= bottom && left <= right) {// 向右遍历上边界for (int j = left; j <= right; ++j) {res.push_back(matrix[top][j]);}if (++top > bottom) break;// 向下遍历右边界for (int i = top; i <= bottom; ++i) {res.push_back(matrix[i][right]);}if (--right < left) break;// 向左遍历下边界for (int j = right; j >= left; --j) {res.push_back(matrix[bottom][j]);}if (--bottom < top) break;// 向上遍历左边界for (int i = bottom; i >= top; --i) {res.push_back(matrix[i][left]);}++left;}return res;}
};

优化说明:

  1. 边界管理: 使用四个变量 top, bottom, left, right 分别表示当前未遍历区域的上下左右边界。每次处理完一个方向后,收缩对应的边界。

  2. 循环条件: 主循环继续的条件是 top <= bottom && left <= right,确保存在未遍历的元素。

  3. 方向处理顺序: 按照右→下→左→上的顺序处理,每次处理完一个方向后立即检查是否需要终止循环,避免无效遍历。

  4. 简洁的循环结构: 每个方向的遍历使用明确的起点和终点,无需手动调整索引位置,代码更直观。

这种方法减少了冗余的条件检查,逻辑清晰,且避免了复杂的索引调整,提高了代码的可读性和健壮性。

http://www.xdnf.cn/news/482.html

相关文章:

  • 2025.04.19-阿里淘天春招算法岗笔试-第一题
  • 金融数学专题6 证券问题与资本利得税
  • Pandas数据统计分析
  • MCS-51单片机汇编语言编程指南
  • ArcPy Mapping 模块基础
  • 3. 进程概念
  • 修改Theme SHELL美化panel
  • Docker 网络详解:从 docker0 网桥到网络命名空间
  • 复习JUC的总结笔记
  • 整流二极管详解:原理、作用、应用与选型要点
  • 什么是零缺陷质量管理?
  • DNS主从同步实验
  • LeetCode 解题思路 42(Hot 100)
  • DDPM(diffusion)原理
  • 健康养生:拥抱美好生活的基石
  • LangChain框架-检索器详解
  • Map和Set相关练习
  • c++_csp-j算法 (2)
  • Vue中的template配置项
  • Kafka下载和使用(Windows版)
  • docker 大模型
  • 【数学】勾股定理
  • 速查手册:TA-Lib 超过150种量化技术指标计算全解 - 2. Momentum Indicators(动量指标)
  • 编译报错 宏 _IOC_SIZEBITS,而这个宏在编译时未定义
  • 2025年赣教云智慧作业微课PPT模板
  • 网络互连与互联网4
  • [Java实战经验]异常处理最佳实践
  • 【langchain4j】Springboot如何接入大模型以及实战开发-AI问答助手(一)
  • 深入剖析JavaScript内存泄漏:识别、定位与实战解决
  • BZOJ P1419 Red is good