首先回顾一下题目

(1)理解题意

拿来题目一看只说明了有一个m行n列的矩阵并用螺旋方式输出,并没有告诉你怎样算螺旋输出;
很蒙对不对? 没关系,画一张图理解一下。

好 现在看这道题就应该容易许多了 就好像螺旋楼梯一样
从最外层向内层魔力转圈 所以数字1到数字5的轨迹 即为螺旋输出

(2)问题分析


假设m*n矩阵下标都是从0开始(本来也是)以下将过程分为四个阶段:
第一阶段 输出下标第0行的数字 1 2 3
第二阶段 输出下标第2列数字 3 6 9
因为下标第0行的数字 3 已经输出过了 所以就从下标第1行数字开始 输出 6 9
第三阶段 同理输出数字 8 7
第四阶段 往上走同理输出数字 4
第一轮完成

你可能会问 5 去哪了
这个 5 啊 是下一过程的第一阶段输出的
什么?你觉得有点蒙 那咱们换一个大点的栗子


这是一个5*5矩阵 还是对它螺旋输出
第一阶段 输出数字 1 2 3 4 5
第二阶段 输出 10 15 20 25
第三阶段 输出 24 23 22 21
第四阶段 输出 15 11 6
第一轮完成
思考:在这个过程中是不是可以定义下标变量,通过变量控制每个阶段的输出

下面第二轮 与第一个例子相同(因为5 * 5矩阵内层就是一个3 * 3矩阵)
第一阶段 输出数字 7 8 9
第二阶段 输出 14 19
第三阶段 输出 18 17
第四阶段 输出 12

第三轮 第一阶段 输出数字 13
矩阵中所有数字都输出过了 回合结束

(3)问题解决

由上面可以看出只需要把一个大问题,拆成一轮一轮的小问题
所以需要下标进行控制 (假设矩阵为matrix 大小m*n)

int rowFirst=0,rowEnd=m-1; //开始行与结尾行的下标
int colFirst=0,colEnd=n-1; //开始列与结尾列的下标

然后对每一轮小问题分四个阶段分别输出 直到矩阵所有元素都输出完结束
那么迭代及迭代的条件就可以为

while(已经输出过的元素个数 < 矩阵元素总数)

每轮通过控制下标实现四个阶段
第一阶段

对第rowFirst行每一列输出
for(int j=colFirst;j<=colEnd;j++)
输出matrix [rowFirst] [j]
rowFirst++; //移到下一行

第二阶段

对第colEnd列的每一行输出
for(int i=rowFirst;i<=rowEnd;i++)
输出 matrix[i][colEnd]
colEnd- -;//移到左边那列

第三阶段
值得一提的是 如果剩余矩阵只有一行 是没必要执行第三阶段的

if(rowFirst<=rowEnd){
for(int j=colEnd;j>=colFirst;j–)
输出matrix[rowEnd][j]
}
rowEnd–;//往上提一行

第四阶段

if(colFirst<=colEnd){
for(int i=rowEnd;i>=rowFirst;i–)
res.add(matrix[i][colFirst]);
}
colFirst++;//往右拽一列

以上是对矩阵最外一轮的输出 在输出过程中下标变量随着变换
循环执行就可以 螺 旋 输 出
结合标题(2)问题分析更容易理解

(4)算法主要代码

java版

import java.util.*;public class Solution {public ArrayList<Integer> spiralOrder(int[][] matrix) {ArrayList<Integer> res = new ArrayList<>();int m = matrix.length;if(m==0) return res;int n = matrix[0].length;int rowFirst=0,rowEnd=m-1;//开始行与结尾行int colFirst=0,colEnd=n-1;//开始列与结尾列while(res.size() < m*n){for(int j=colFirst;j<=colEnd;j++)res.add(matrix[rowFirst][j]);rowFirst++;for(int i=rowFirst;i<=rowEnd;i++)res.add(matrix[i][colEnd]);colEnd--;if(rowFirst<=rowEnd){for(int j=colEnd;j>=colFirst;j--)res.add(matrix[rowEnd][j]);}rowEnd--;if(colFirst<=colEnd){for(int i=rowEnd;i>=rowFirst;i--)res.add(matrix[i][colFirst]);}colFirst++;}return res;}
}

新增c++版

#include<iostream>
using namespace std;int main(void){int m,n;cout<<"建立m*n矩阵(输入m、n):"<<endl;cin>>m>>n;int ma[m][n],p=1;for(int i=0;i<m;i++){for(int j=0;j<n;j++){ma[i][j]=p++;}} cout<<endl;for(int i=0;i<m;i++){for(int j=0;j<n;j++){printf("%3d",ma[i][j]);}cout<<endl;}int k=0;//计数器 if(m==0) return 0;int rowFirst=0,rowEnd=m-1;int colFirst=0,colEnd=n-1;//定义行列始末下标cout<<"结果为:"<<endl; while(k<m*n){for(int j=colFirst;j<=colEnd;j++){cout<<ma[rowFirst][j]<<" ";k++;}rowFirst++;for(int i=rowFirst;i<=rowEnd;i++){cout<<ma[i][colEnd]<<" ";k++;}colEnd--;if(rowFirst<=rowEnd)for(int j=colEnd;j>=colFirst;j--){cout<<ma[rowEnd][j]<<" ";k++;}rowEnd--;if(colFirst<=colEnd)for(int i=rowEnd;i>=rowFirst;i--){cout<<ma[i][colFirst]<<" ";k++;}colFirst++;} cout<<endl;return 0;
}

测试用例

输入3 3 建立3*3矩阵

输入5 5

以上!

【Leetcode】对 矩 阵 螺 旋 输 出 java/c++相关推荐

  1. android socket握手,HttpURLConnection抛出java.net.SocketTimeoutException:在Android 4.1.1中SSL握手超时...

    在Android 5.0及更高版本中运行时,我的代码运行正常.但是在Android 4.1.1中它会抛出java.net.SocketTimeoutException:SSL握手超时. URL url ...

  2. AES加密时抛出java.security.InvalidKeyException:#160;Illegal#160;key#160;size#160;or#160;def...

    原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...

  3. 启动EBS的时候,弹出Java安全警告:“该应用程序要求具有Java的早期版本。是否要继续?”...

    问题 启动EBS的时候,弹出Java安全警告:"该应用程序要求具有Java的早期版本.是否要继续?" 如果是JRE英文的,弹出的Java警告为"The applicati ...

  4. java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)

    cas实现单点登录,登出(java跟php客户端)(转)cas实现单点登录,登出(java和php客户端) (转) 最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php ...

  5. 完成这个例子,说出java中针对异常的处理机制。

    有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个方法a,请在这个方法中调用b,然后抛出异常.在客户端有一个类为TestC,有一个方 ...

  6. LeetCode 147. Insertion Sort List 链表插入排序 C++/Java

    LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...

  7. 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...

    近日,有人在网上问了这个问题,引起了网友热议: 为什么中国这么多高薪程序员,开发不出Java,Typescript, Python, Rust, Node.js这些基础设施? 对这个问题,大家从不同角 ...

  8. 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生

    //循环录(输)入 java 课的学生成绩(5个学生),//统计分数大于等于 80 分的学生public static void test8(){Scanner sc = new Scanner(Sy ...

  9. Android ADT插件更新后程序运行时抛出java.lang.VerifyError异常解决办法

    当我把Eclipse中的 Android ADT插件从21.1.0更新到22.0.1之后,安装后运行程序抛出java.lang.VerifyError异常. 经过调查,终于找到了一个有效的解决办法: ...

最新文章

  1. 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)
  2. 体验Windows 7的Superbar
  3. 谷歌希望通过 Adiantum 为更多人提供加密功能
  4. WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存
  5. SocketLog-微信调试、API调试和AJAX的调试的工具,能将日志通过WebSocket输出到Chrome浏览器的console中
  6. 步进电机s型加减速计算工具_步进电机噪音和振动的原因分析及应对策略
  7. CF1354F. Summoning Minions
  8. 信息学奥赛C++语言:陶陶摘苹果
  9. 手把手教你安装 FastAdmin 到虚拟主机 (phpStudy)
  10. 剑指 Offer JZ35 复杂链表的复制
  11. jqgrid 使用小记——与springboot jpa 一起使用的分页,翻页。(使用springboot jpa 原生的分页)...
  12. Python第三方库使用感言
  13. mt65xx android phone win10驱动,mt65xx android phone驱动
  14. FineReport帆软报表的安装
  15. 工业软件深度:中国PLM/MES/SCADA/DCS格局与主要玩家分析~
  16. 可编程逻辑器件FPGA学习-VHDL
  17. android图片分辨率改变,在Android应用中更改位图分辨率
  18. socket服务器针对客户端ip变更的处理办法
  19. 千挂科技与东风柳汽达成前装量产合作,2024年交付自动驾驶牵引车
  20. 【语音识别】基于keras的简易语音识别

热门文章

  1. Linux文本三剑客
  2. 小谈Oben_Pai——AI+区块链的超级APP落地应用
  3. 有关颜色敏感度测试的软件是啥,测试你对颜色的敏感度,最后一题能答对算你厉害!...
  4. 软件使用说明网站+IT新闻评论
  5. 如何截取第一个括号_王者荣耀如何取空白名和重复名
  6. 【Bioinformatics】背曲拇指与 Ehlers-Danlos syndrome
  7. 【絮叨.1】同时在写四门语言是怎样一种体验?
  8. C语言--自定义字符串输入/输出函数
  9. 只有在细细品读她的作品的时候,我才找到久违的宁静
  10. 上海2021年高考成绩排位查询,2021年上海高考分数一分一段位次表,上海高考个人成绩排名查询方法...