Java螺旋矩阵处理方法详解
作者:刘婉晴 时间:2021-09-24 02:14:55
题目描述:
给定一 m*n 的矩阵,请按照逆时针螺旋顺序,返回矩阵中所有元素。
示例:
思路:
这是一道典型的模拟问题:
我们可以分析一下,遍历前进轨迹: 向右 - > 向下 -> 向左 -> 向上 -> 向右 …
于是,我们可以在循环中模拟这样的前进轨迹,记录 右,下,上左,四个边界,每次拐弯时更新边界值,再进行下一次拐弯,循环往复,直至结束。结束条件为 左边界加一大于右边界,或者上边界加一大于下边界。
图解:
代码:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<Integer>();
// 思路: 注意上下左右边界 —— 走格子法(一直走,一直走,直到走完了,出去)
int left = 0;
int right = matrix[0].length - 1;
int up = 0;
int down = matrix.length - 1;
if(right==-1 || down==-1){
return list;
}
while(true){
// 向右走
for(int i=left; i<=right; i++){
list.add(matrix[up][i]);
}
// 判断是否结束
if(up+1 > down){
break;
} else{
up++; // 更新上边界
}
// 向下走
for(int i=up; i<=down; i++){
list.add(matrix[i][right]);
}
// 判断是否结束
if(right - 1 < left){
break;
} else{
right--; // 更新右边界
}
// 向左走
for(int i=right; i>=left; i--){
list.add(matrix[down][i]);
}
// 判断是否结束
if(down-1 < up){
break;
} else{
down--; // 更新下边界
}
// 向上走
for(int i=down; i>=up; i--){
list.add(matrix[i][left]);
}
// 判断是否结束
if(left + 1 > right ){
break;
} else{
left++; // 更新左边界
}
}
return list;
}
}
变式一: 题目描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例:
代码:
class Solution {
public int[][] generateMatrix(int n) {
int[][] ans = new int[n][n];
int left = 0;
int right = n - 1;
int up = 0;
int down = n - 1;
int start = 1;
while(true){
// 向右
for(int i=left; i<=right; i++){
ans[up][i] = start;
start++;
}
if(++ up > down){
break;
}
// 向下
for(int i=up; i<=down; i++){
ans[i][right] = start;
start++;
}
if(-- right < left){
break;
}
// 向左
for(int i=right; i>=left; i--){
ans[down][i] = start;
start++;
}
if(-- down < up){
break;
}
// 向上
for(int i=down; i>=up; i--){
ans[i][left] = start;
start++;
}
if(++ left > right){
break;
}
}
return ans;
}
}
来源:https://blog.csdn.net/liuwanqing233333/article/details/126878112
标签:Java,螺旋矩阵,旋转矩阵
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
SpringBoot MongoDB与MongoDB GridFS基本使用
2023-07-31 06:26:47
![](https://img.aspxhome.com/file/2023/7/77997_0s.png)
基于JavaMail实现邮件发送
2022-06-21 02:28:06
C#生成指定范围内的不重复随机数
2021-10-01 13:49:26
详解Android Flutter中SliverAppBar的使用教程
2023-06-23 12:11:27
![](https://img.aspxhome.com/file/2023/7/97867_0s.jpg)
java 归并排序的实例详解
2021-12-06 22:58:05
Android中获取网页表单中的数据实现思路及代码
2021-07-04 19:51:18
解析java中super的用法分析
2021-11-17 19:39:52
Spring Security配置多个数据源并添加登录验证码的实例代码
2022-11-19 13:49:26
![](https://img.aspxhome.com/file/2023/6/69126_0s.png)
C# ping网络IP 实现网络状态检测的方法
2023-01-11 14:31:05
获取JsonObject某一未知key的值操作
2023-02-10 15:09:45
Android 如何实现动态申请权限
2023-07-30 00:51:31
springBoot系列常用注解(小结)
2023-12-17 23:26:45
![](https://img.aspxhome.com/file/2023/7/71027_0s.png)
基于ReentrantLock的实现原理讲解
2023-11-23 22:43:23
![](https://img.aspxhome.com/file/2023/9/59849_0s.jpg)
C#操作ini文件的帮助类
2022-12-26 17:11:09
java web个人通讯录系统设计
2022-09-14 11:12:15
![](https://img.aspxhome.com/file/2023/0/71910_0s.png)
spring boot集成smart-doc自动生成接口文档详解
2023-11-28 23:08:02
![](https://img.aspxhome.com/file/2023/3/60773_0s.png)
springboot整合kaptcha生成验证码功能
2023-07-14 21:48:51
![](https://img.aspxhome.com/file/2023/6/71896_0s.png)
C#实现剪切板功能
2023-01-16 12:26:48
C#实现文件上传及文件下载功能实例代码
2022-12-13 23:57:23
基于springboot的flowable工作流实战流程分析
2022-11-28 08:27:09
![](https://img.aspxhome.com/file/2023/3/64803_0s.png)