Java螺旋矩阵处理方法详解

作者:刘婉晴 时间:2021-09-24 02:14:55 

题目描述:

给定一 m*n 的矩阵,请按照逆时针螺旋顺序,返回矩阵中所有元素。

示例:

Java螺旋矩阵处理方法详解

思路:

这是一道典型的模拟问题:

我们可以分析一下,遍历前进轨迹: 向右 - > 向下 -> 向左 -> 向上 -> 向右 …

于是,我们可以在循环中模拟这样的前进轨迹,记录 右,下,上左,四个边界,每次拐弯时更新边界值,再进行下一次拐弯,循环往复,直至结束。结束条件为 左边界加一大于右边界,或者上边界加一大于下边界。

图解:

Java螺旋矩阵处理方法详解

代码:

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 ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例:

Java螺旋矩阵处理方法详解

代码:

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,螺旋矩阵,旋转矩阵
0
投稿

猜你喜欢

  • 使用注解@Validated和BindingResult对入参进行非空校验方式

    2022-09-16 11:30:44
  • Java登录功能实现token生成与验证

    2023-11-30 07:57:28
  • java 获取对象中为null的字段实例代码

    2023-08-28 06:32:53
  • Android开发flow常见API的使用示例详解

    2021-09-25 05:27:49
  • C#类中方法的执行顺序是什么

    2022-07-01 03:55:15
  • 在当前Activity之上创建悬浮view之WindowManager悬浮窗效果

    2023-02-09 21:02:12
  • idea无法切换分支报错问题及解决

    2023-12-14 22:39:26
  • Kotlin协程到底是如何切换线程的

    2022-03-03 13:52:39
  • Java对象转json JsonFormat注解

    2022-08-27 00:44:09
  • Android实现一个丝滑的自动轮播控件实例代码

    2022-01-24 03:08:19
  • Android手机屏幕同步工具asm.jar

    2023-10-31 20:01:26
  • Java多线程之同步锁-lock详解

    2023-12-16 14:40:08
  • 深入剖析Java中String类的concat方法

    2023-06-02 07:07:13
  • java编程之基于SpringBoot框架实现扫码登录

    2023-02-14 02:39:28
  • 浅谈Android轻量级的数据缓存框架RxCache

    2023-12-22 14:01:30
  • 详解Android中IntentService的使用方法

    2021-07-14 06:49:49
  • 深入了解C语言的动态内存管理

    2023-09-19 23:46:11
  • Java 代理(Proxy)的原理及应用

    2023-08-21 08:40:41
  • Android App中自定义View视图的实例教程

    2021-08-16 16:54:35
  • C#采用递归实现阶乘的方法

    2022-12-09 09:24:56
  • asp之家 软件编程 m.aspxhome.com