NK2_二维数组矩阵_螺旋矩阵(给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。)+ 拓展c# 规则、不规则定义二维数组方式

题目描述

给定一个m x n大小的矩阵(m行,n列),按螺旋的顺序返回矩阵中的所有元素。
例如,

给出以下矩阵:

[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]

你应该返回[1,2,3,6,9,8,7,4,5]。

  • 分析

只想出了特殊的情况 (如矩阵为空)返回null的情况

没!思!路!(菜鸡的呐喊~)

看了题解,思路是:

设置上、下、左、右四个界限,分别对应 矩阵 的 行、列界限,根据题意螺旋遍历插入元素到ArrayList集合中

根据题意螺旋遍历 分为 4 个方向,行从左到右—>列从上到下—>行从右到左—>列从下到上

然后螺旋遍历的前面需要判断条件:是否左界限 越过 右界限,是否上界限 越过 下界限 。每次行、列遍历添加到list后界限值都会改变)

若越过,就证明已经完成螺旋

  • 代码
import java.util.*;
public class Solution {
    public ArrayList<Integer> spiralOrder(int[][] matrix) {
        ArrayList<Integer> list = new ArrayList<>();
        //空矩阵
        if(matrix.length == 0){
            return list;
        }
        //空矩阵
        else if(matrix[0].length == 0){
            return list;
        }
        //设置下标界限
        
        //行的下标界限
        int up = 0;
        int down = matrix.length - 1;
        
        //列下标的界限
        int left = 0;
        int right = matrix[0].length - 1;
        
        int i = 0;
        while(true){
            //完成结束的条件
            if(left>right){
                return list;
            }
            //还没有完成,从up行(开始是第0行)开始向list添加元素,一个循环结束,添加一行
            //进行之后第up行的添加任务已经完成,上限行号界限下移,也就是要添加到list的元素范围圈变小了
            for(int k = left;k<=right;k++){
                list.add(matrix[up][k]);
            }
            up++;
            //完成结束的条件
            if(up>down){
                return list;
            }
            //还没有完成,从第down列(开始是最后一列)开始像list添加,一个循环结束,天添加了一列
            //进行完之后第right列的添加任务已经完成,右限列号界限左移
            
            for(int k = up;k<= down;k++){
                list.add(matrix[k][right]);
            }
            right--;
            
            if(left>right){
                return list;
            }
            //从第down行开始(开始是最后一行)从右向左添加,一个循环结束,添加了一行
            //进行完第down行的添加任务已经完后,下限行号界限上移
            for(int k = right;k>=left;k--){
                list.add(matrix[down][k]);
            }
            down--;
            
            if(up>down){
                return list;
            }
            //从第left列开始(开始是第0列),向上添加,一个循环结束,添加了一列
            //进行完第left的添加任务已经完成,左限列号界限右移
            for(int k = down;k>= up;k--){
                list.add(matrix[k][left]);
            }
            left++;
            
        }
        
        
    }
}

而且需要注意

给定一个矩阵,如何获取行、列的数量,假定a是二维数组矩阵

a.length ----》行的数目

a[0].length -----》列的书目

拓展

这里我想到c#定义二维数组的方式,c#定义二维数组的方式和Java和C不太相同

c#中有交差数组的概念(就是数组嵌套数组)

如果像Java那样定义数组int [] [] arr = new int [2] [ 3]就是不规则的交差数组

而规则的定义方法是int [ , ] arr = new int [ 2, 3];

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

scl、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值