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

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.xdnf.cn/news/20002.html

相关文章:

  • K8S容器POD内存快照导出分析处理方案
  • Nano-Banana使用教程
  • websocket的key和accept分别是多少个字节
  • Widget 生命周期
  • 【Python基础】 13 Rust 与 Python 注释对比笔记
  • 零基础两个月通关2025下半年软考!保姆级冲刺规划(附每日学习表)
  • 随时学英语5 逛生活超市
  • 25高教社杯数模国赛【C题顶流思路+问题解析】第三弹
  • 处理PostgreSQL中的磁盘I/O瓶颈
  • 从BERT到T5:为什么说T5是NLP的“大一统者”?
  • 一键成文,标准随行——文思助手智能写作助力政务提效
  • 常见的相机模型针孔/鱼眼(Pinhole,Mei,K
  • 从零构建一款开源在线客服系统:我的Go语言实战之旅
  • 对话A5图王:20年互联网老兵,从Web1.0到Web3.0,牛友会里藏着最真的创业情
  • 后端Long类型数据传给前端造成精度丢失
  • ReAct模式解读
  • Linux 编译 Android 版 QGroundControl 软件并运行到手机上
  • 东土正创AI交通服务器再获北京市批量应用订单
  • Agent Prompt工程:如何让智能体更“听话”?(实践指南)
  • 20250904 10:45_排查10.1.3.35新QMS系统RMAN备份失败问题(优化脚本里的环境配置,增加了check_oracle_env 函数)
  • openai-python v1.104.2版本发布:修复Web搜索工具类型别名问题
  • uni-app iOS 上架常见问题与解决方案,实战经验全解析
  • 2025数学建模国赛高教社杯C题思路代码文章助攻
  • Java对接Kafka的三国演义:三大主流客户端全景评测
  • 25高教社杯数模国赛【C题国一学长思路+问题分析】第二弹
  • 以数据与自动化驱动实验室变革:智能化管理整体规划
  • 救命!Shell用了100次还不懂底层?爆肝300行代码从0造“壳”,fork/exec/重定向全扒光,Linux系统编程直接开挂!
  • 【面试题】Prompt是如何生成的,优化目标是什么,任务是什么?
  • 服务器监控不用盯屏幕:Ward+Cpolar让异常告警主动找到你
  • Cursor 辅助开发:快速搭建 Flask + Vue 全栈 Demo 的实战记录