【Leetcode】对 矩 阵 螺 旋 输 出 java/c++
首先回顾一下题目
(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++相关推荐
- android socket握手,HttpURLConnection抛出java.net.SocketTimeoutException:在Android 4.1.1中SSL握手超时...
在Android 5.0及更高版本中运行时,我的代码运行正常.但是在Android 4.1.1中它会抛出java.net.SocketTimeoutException:SSL握手超时. URL url ...
- 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. ...
- 启动EBS的时候,弹出Java安全警告:“该应用程序要求具有Java的早期版本。是否要继续?”...
问题 启动EBS的时候,弹出Java安全警告:"该应用程序要求具有Java的早期版本.是否要继续?" 如果是JRE英文的,弹出的Java警告为"The applicati ...
- java php 单点登陆,cas实现单点登录,登出(java跟php客户端)(转)
cas实现单点登录,登出(java跟php客户端)(转)cas实现单点登录,登出(java和php客户端) (转) 最近项目中需要做单点登录,客户端包含java和php,java有几个应用程序,php ...
- 完成这个例子,说出java中针对异常的处理机制。
有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个方法a,请在这个方法中调用b,然后抛出异常.在客户端有一个类为TestC,有一个方 ...
- LeetCode 147. Insertion Sort List 链表插入排序 C++/Java
LeetCode 147. Insertion Sort List 链表插入排序 C++/Java Sort a linked list using insertion sort. A graphic ...
- 为什么中国这么多高薪程序员,开发不出Java, Typescript, Python, Rust, Node.js这些基础设施?...
近日,有人在网上问了这个问题,引起了网友热议: 为什么中国这么多高薪程序员,开发不出Java,Typescript, Python, Rust, Node.js这些基础设施? 对这个问题,大家从不同角 ...
- 循环录(输)入 java 课的学生成绩(5个学生),统计分数大于等于 80 分的学生
//循环录(输)入 java 课的学生成绩(5个学生),//统计分数大于等于 80 分的学生public static void test8(){Scanner sc = new Scanner(Sy ...
- Android ADT插件更新后程序运行时抛出java.lang.VerifyError异常解决办法
当我把Eclipse中的 Android ADT插件从21.1.0更新到22.0.1之后,安装后运行程序抛出java.lang.VerifyError异常. 经过调查,终于找到了一个有效的解决办法: ...
最新文章
- 数据结构(03)— 数据处理基本操作(数据的查找、新增、删除、修改)
- 体验Windows 7的Superbar
- 谷歌希望通过 Adiantum 为更多人提供加密功能
- WSS中的SPSite和SPWeb为什么需要释放内存,如何快速发现代码中的未释放内存
- SocketLog-微信调试、API调试和AJAX的调试的工具,能将日志通过WebSocket输出到Chrome浏览器的console中
- 步进电机s型加减速计算工具_步进电机噪音和振动的原因分析及应对策略
- CF1354F. Summoning Minions
- 信息学奥赛C++语言:陶陶摘苹果
- 手把手教你安装 FastAdmin 到虚拟主机 (phpStudy)
- 剑指 Offer JZ35 复杂链表的复制
- jqgrid 使用小记——与springboot jpa 一起使用的分页,翻页。(使用springboot jpa 原生的分页)...
- Python第三方库使用感言
- mt65xx android phone win10驱动,mt65xx android phone驱动
- FineReport帆软报表的安装
- 工业软件深度:中国PLM/MES/SCADA/DCS格局与主要玩家分析~
- 可编程逻辑器件FPGA学习-VHDL
- android图片分辨率改变,在Android应用中更改位图分辨率
- socket服务器针对客户端ip变更的处理办法
- 千挂科技与东风柳汽达成前装量产合作,2024年交付自动驾驶牵引车
- 【语音识别】基于keras的简易语音识别
热门文章
- Linux文本三剑客
- 小谈Oben_Pai——AI+区块链的超级APP落地应用
- 有关颜色敏感度测试的软件是啥,测试你对颜色的敏感度,最后一题能答对算你厉害!...
- 软件使用说明网站+IT新闻评论
- 如何截取第一个括号_王者荣耀如何取空白名和重复名
- 【Bioinformatics】背曲拇指与 Ehlers-Danlos syndrome
- 【絮叨.1】同时在写四门语言是怎样一种体验?
- C语言--自定义字符串输入/输出函数
- 只有在细细品读她的作品的时候,我才找到久违的宁静
- 上海2021年高考成绩排位查询,2021年上海高考分数一分一段位次表,上海高考个人成绩排名查询方法...