螺旋矩阵是指一个呈螺旋状的矩阵,它的数字由第一行开始到右边不断变大,向下变大,向左变大,向上变大,如此循环。利用java实现的螺旋矩阵,当输入N之后,会自动打印出螺旋矩阵
题目描述:
给定一 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;
}
}到此这篇关于Java螺旋矩阵处理方法详解的文章就介绍到这了,更多相关Java螺旋矩阵内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
编程基础网
本文标题为:Java螺旋矩阵处理方法详解
基础教程推荐
猜你喜欢
- Java实现插入排序算法可视化的示例代码 2023-04-23
- java知识点7——面向过程和面向对象、面向对象的内存分析、构造方法 2023-09-01
- MyBatis-Plus自定义通用的方法实现 2023-07-15
- Java List的get方法 2023-10-08
- RocketMQ Push 消费模型示例详解 2023-05-24
- Java Web开发中过滤器和监听器使用详解 2023-06-30
- 关于Java双大括号{{}}的具体使用 2023-03-15
- Java多线程学习笔记之三内存屏障与Java内存模型 2023-09-01
- 一文带你搞懂Java中方法重写与方法重载的区别 2023-07-14
- Spring Cloud Config分布式配置中心使用介绍详解 2023-05-07
