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

LeetCode 面试经典 150_矩阵_螺旋矩阵(35_54_C++_中等)(按层模拟)

LeetCode 面试经典 150_矩阵_螺旋矩阵(35_54_C++_中等)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(按层模拟):
      • 代码实现
        • 代码实现(思路一(按层模拟))
        • 以思路一为例进行调试

题目描述:

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

提示:
m== matrix.length
n == matrix[i].length
1 <= m, n <= 10
-100 <= matrix[i][j] <= 100

题解:

解题思路:

思路一(按层模拟):

1、通过给的示例,我们可以联想到切方块豆腐的场景,按顺时针方向,从外向内先横着切一刀后竖着切一刀重复进行下去。这样我们的豆腐会越来越小,直到不能再切。

2、具体思路如下:
① 我们可以使用 row_begin 和 row_end 代表第一行和最后一行,使用 column_begin 和 column_end 代表第一列和最后一列。
② 这样我们可以根据豆腐的具体尺寸来控制豆腐的切块,注意 row_begin=row_end 时单看行方向是可以切一刀的,同理 column_begin=column_end 时也可以切一刀。
③ 因为是按顺时针方向切豆腐,总共切了豆腐的四个方向(上右下左),所以我们可以分为四种切法。
④ 切豆腐上方时 row_begin 增加,切豆腐右方时 column_end 减小,切豆腐下方时 row_end 减小,切豆腐左方时 column_begin增加。

3、复杂度分析
① 时间复杂度:O(NM),M代表行数,N代表列数,因只遍历一遍二维数组 。
② 空间复杂度:O(1),除了输出数组以外,空间复杂度是常数。

代码实现

代码实现(思路一(按层模拟))
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;//用于区分四种情况 int n=1; int row_begin=0,row_end=matrix.size()-1; int column_begin=0,column_end=matrix[0].size()-1;//注意row_end=row_begin或column_end=column_begin可以切 while(row_end>=row_begin&&column_end>=column_begin){//上_横着切_行的开始增大 if(n%4==1){for(int i=column_begin;i<=column_end;i++){ans.emplace_back(matrix[row_begin][i]);}++row_begin; //右_竖着切_列的末尾减小 }else if(n%4==2){for(int i=row_begin;i<=row_end;i++){ans.emplace_back(matrix[i][column_end]);}--column_end;//下_横着切_行的末尾减小}else if(n%4==3){for(int i=column_end;i>=column_begin;i--){ans.emplace_back(matrix[row_end][i]);}--row_end;//左_竖着切_列的开始增大 }else{for(int i=row_end;i>=row_begin;i--){ans.emplace_back(matrix[i][column_begin]);}++column_begin;}++n;}return ans;}
};
以思路一为例进行调试
#include<iostream>
#include<vector>
using namespace std;class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;//用于区分四种情况 int n=1; int row_begin=0,row_end=matrix.size()-1; int column_begin=0,column_end=matrix[0].size()-1;//注意row_end=row_begin或column_end=column_begin可以切 while(row_end>=row_begin&&column_end>=column_begin){//上_横着切_行的开始增大 if(n%4==1){for(int i=column_begin;i<=column_end;i++){ans.emplace_back(matrix[row_begin][i]);}++row_begin; //右_竖着切_列的末尾减小 }else if(n%4==2){for(int i=row_begin;i<=row_end;i++){ans.emplace_back(matrix[i][column_end]);}--column_end;//下_横着切_行的末尾减小}else if(n%4==3){for(int i=column_end;i>=column_begin;i--){ans.emplace_back(matrix[row_end][i]);}--row_end;//左_竖着切_列的开始增大 }else{for(int i=row_end;i>=row_begin;i--){ans.emplace_back(matrix[i][column_begin]);}++column_begin;}++n;}return ans;}
};int main(){vector<vector<int>> matrix={{1,2,3,4},{5,6,7,8},{9,10,11,12}} ;Solution s;vector<int> ans=s.spiralOrder(matrix);for(const auto i:ans){cout<<i<<" ";}return 0;
}

LeetCode 面试经典 150_矩阵_螺旋矩阵(35_54)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/a/366365.html

相关文章:

  • WEB3的资料——免费开放
  • E-E-A-T与现代SEO:赢得搜索引擎信任的完整策略
  • 新规则,新游戏:AI时代下的战略重构与商业实践
  • Rustdesk搭建与客户端修改与编译
  • 国内外常用的免费BUG管理工具选型
  • 2025精选榜:4款好用的企业即时通讯软件推荐!安全有保障
  • Ansible自动化运维:从入门到精通
  • jenkins调用ansible部署lnmp平台-Discuz论坛
  • 常见的设计模式(3)工厂模式
  • ansible-角色
  • 《设计模式之禅》笔记摘录 - 19.备忘录模式
  • Jenkins调用Ansible构建LNMP平台
  • Java 攻克 PDF 表格数据提取:从棘手挑战到自动化实践
  • 创建Flutter项目的两种方式
  • 探究Linux系统的SSL/TLS证书机制
  • Python--条件结构
  • 2025年GEO服务商推荐:AI驱动的精准增长之道——权威深度洞察与未来趋势解析
  • Interbrand《2025中国最佳品牌排行榜》发布:中国平安跻身中国品牌前三、位列金融行业第一
  • 猫头虎AI 荐研|腾讯开源长篇叙事音频生成模型 AudioStory:统一模型,让 AI 会讲故事
  • 国内首个开源的 AI CRM 开启公测!
  • 汉诺塔递归过程推导(详细+省流)
  • MySQL高可用之组复制(MGR)
  • 单串口服务器-工业级串口联网解决方案
  • 数据库中事务、指令、写法解读
  • 【Cesium】介绍及基础使用
  • 新手向:使用 DeepSeek 帮助自己的工作
  • React Hooks深度解析:useState、useEffect及自定义Hook最佳实践
  • Shadcn UI – 开发者首选的高性能、高定制化 React 组件库
  • 【Day 20】148.排序链表
  • Flash Attention vs Paged Attention:大语言模型注意力计算的内存管理革命