Java螺旋矩阵处理方法详解
作者:刘婉晴 发布时间:2021-09-24 02:14:55
标签:Java,螺旋矩阵,旋转矩阵
题目描述:
给定一 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


猜你喜欢
- 需求:request的content-type为applciation/json,进入controller之前需要把body中的参数取出来做
- 什么是耦合性耦合性(Coupling),也叫耦合度,是对模块间关联程度的度量。模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、
- Long end,long num,File file,String charset4个参数说明end 相当于坐标 ,tail 向上的起点,
- 本文实例讲述了Java使用Socket通信传输文件的方法。分享给大家供大家参考,具体如下:前面几篇文章介绍了使用Java的Socket编程和
- 前言目前有两套RocketMQ集群,集群A包含topic名称为cluster_A_topic,集群B包含topic名称为cluster_B_
- 最近在做一个资源共享的项目中,采用了Struts2.1.8+Spr
- SpringBoot版本2.2.4.RELEASE。【1】SpringBoot接收到请求① springboot接收到一个请求返回json格
- 由于项目需要在NDK中使用网络开发,对于c语言网络开发来说,libcurl库是个很不错的选择,但android系统中并没有自带该库,所以就得
- 1. Date.compareTo()java.util.Date提供了在Java中比较两个日期的经典方法compareTo()。如果两个日
- 前言同C语言一样,Java也有断言关键字assert,它们的用法也比较相似。注意:Java的断言是从1.4版本开始的,以前的版本不支持断言。
- 一、ConcurrentLinkedQueue介绍并编程中,一般需要用到安全的队列,如果要自己实现安全队列,可以使用2种方式:方式1:加锁,
- 随着C#的发展,该语言内容不断丰富,开发变得更加方便快捷,C# 的锋利尽显无疑。C# 语言从诞生起就是强类型语言,这一性质到今天不曾改变,我
- 美团电商应用平台大家使用非常频繁,下面小编通过本文给大家介绍电商应用平台中常用的选择类别下拉列表的实现。先给大家展示下效果图:一、下拉列表的
- 目录1、需求2、问题2、获取1)导入依赖为了获取客户端类型、操作系统类型、ip、port2)封装获取body字符串的工具类3) * 类4)继
- 话不多说,上代码: /** * 获取字符串的长度,如果有中文,则每个中文字符计为2位 * @param value
- 本文实例为大家分享了java日期时间操作工具类,供大家参考,具体内容如下虽然jdk1.8开始,加入了time包,里面对时区,本地化时间,格式
- 某天突然发现idea非常重要的快捷键ctrl+shift+f无效了,网上搜了很多都说是qq快捷键冲突,但是找了下qq快捷键却没有解决,现在给
- 注意是maven的webapp:选择maven下一步下一步。maven下载过慢在setting中加入镜像。 我也有疑问这是什么鬼格式,但是证
- System.ComponentModel.Design.DesignSurface是为设计组件提供一个用户界面,通过它可以实现一个简单的窗
- Parallel类(https://www.jb51.net/article/244267.htm)的并行任务需要结束后才能运行后面的代码,