二维数组的螺旋遍历

本文介绍了一种螺旋方式遍历二维数组的方法,并提供了实现这一遍历逻辑的示例代码。通过定义循环次数和坐标变量,实现了从左到右、从上到下、从右到左、从下到上的四步遍历过程。
  • 原理及遍历结果如图所示:
    在这里插入图片描述
  • 示例代码
private static List<Integer> spiralArray(int[][] array) {
        // 数组为空,返回null
        if (array.length == 0 || array[0].length == 0) {
            return null;
        }
        // 获取循环遍历的次数,取行、列中的最小值的1/2
        int temp = (Math.min(array.length, array[0].length) + 1) / 2;
        List<Integer> results = Lists.newArrayList();
        for (int item = 0; item < temp; item++) {
            // 需要遍历的总列
            int col = array[item].length - item;
            // 需要遍历的总行
            int row = array.length - item;
            // 纵坐标,此时数据所在的列
            int x = item;
            // 横坐标,此时数据所在的行
            int y = item;
            // 从左往右遍历,此时纵坐标不变,横坐标依次递增,退出条件:y = col
            for (; y < col; y++) {
                results.add(array[x][y]);
            }
            // 从上往下遍历,此时横坐标不变,纵坐标依次递增。此时 y = col,数组的索引的起始值是0,故在使用y作为纵坐标的时候,y = y-1
            for (x += 1; x < row; x++) {
                results.add(array[x][y - 1]);
            }
            /**
             * 从左往右遍历,此时纵坐标不变,横坐标依次递减
             * 上面退出循环的条件时,x == row,而数组的索引的起始值是0,故在使用x作为纵坐标的时候,x = x-1
             * 此时 y = col,纵坐标的索引的最大值为 col - 1,而在从上往下遍历元素的时候已经遍历了最右下角的元素,避免重复,故初始化 y = col - 1 -1;
             */
            for (y = y - 2; y > item; y--) {
                results.add(array[x - 1][y]);
            }
            /**
             * 从下往上遍历,此时横坐标不变,纵坐标依次递减
             * 上面退出循环的条件时,x == row,而数组的索引的起始值是0,故在使用x作为纵坐标的时候,初始化 x = x-1
             * 在进行从左往右进行遍历的时候,已经对最左上角的元素进行了遍历,为了避免重复,所以纵坐标的结束条件为:遍历的次数+1
             */
            for (x = x - 1; x >= item + 1; x--) {
                results.add(array[x][y]);
            }
        }
        return results;
    }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值