螺旋矩阵类通用思路

螺旋矩阵类通用思路


前言

提示:leetcode做题一定要看清楚题目,如果不懂题目可以去评论区看看大家对题目的理解。
忌讳:不懂题目的意思就答题


解题思路

  1. 总共有四种循环方式,我把这4种方式分为4个case。
  2. 设置分别设置这4个case的循环次数
  3. 根据循环方式迭代

在这里插入图片描述


54. 螺旋矩阵

题目描述
提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • -100 <= matrix[i][j] <= 100

代码实现

时间复杂度: O(n * m),空间复杂度: O(1)

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int n = matrix.length;
        int m = matrix[0].length;
        List<Integer> integerList = new ArrayList<>(m * n);
        spiral(integerList, matrix, 0, 0, n, m, 1);
        return integerList;
    }

    /**
     * @param list      最后返回结果集
     * @param matrix    数据源
     * @param i         一维数组下标
     * @param ii        二维数组下标
     * @param nBoundary 一维数组循环次数
     * @param mBoundary 二维数组循环次数
     * @param type      循环类型
     */
    public void spiral(List<Integer> list, int[][] matrix, int i, int ii, int nBoundary,int mBoundary, int type) {
        if (nBoundary == 0 || mBoundary == 0) {
            return;
        }
        int index = 0;
        switch (type) {
            case 1:
                while (index < mBoundary) {
                    list.add(matrix[i][ii]);
                    ii++;
                    index++;
                }
                spiral(list, matrix, ++i, --ii, --nBoundary, mBoundary, 2);
                break;
            case 2:
                while (index < nBoundary) {
                    list.add(matrix[i][ii]);
                    i++;
                    index++;
                }
                spiral(list, matrix, --i, --ii, nBoundary, --mBoundary, 3);
                break;
            case 3:
                while (index < mBoundary) {
                    list.add(matrix[i][ii]);
                    ii--;
                    index++;
                }
                spiral(list, matrix, --i, ++ii, --nBoundary, mBoundary, 4);
                break;
            case 4:
                while (index < nBoundary) {
                    list.add(matrix[i][ii]);
                    i--;
                    index++;
                }
                spiral(list, matrix, ++i, ++ii, nBoundary, --mBoundary, 1);
                break;
        }
    }
}

59. 螺旋矩阵 II

题目描述


代码实现

时间复杂度: O(n2), 空间复杂度: O(1)

class Solution {
    public int[][] generateMatrix(int n) {
        int[][] matrix = new int[n][n];
        spiral(matrix, 1, 0, 0, n, 1);
        return matrix;
    }


    /**
     * @param matrix   结果集
     * @param value    数据源
     * @param i        一维数组下标
     * @param ii       二维数组下标
     * @param boundary 循环次数
     * @param type     循环类型
     */
    public void spiral(int[][] matrix, int value, int i, int ii, int boundary, int type) {
        if (boundary == 0) {
            return;
        }
        int index = 0;
        switch (type) {
            case 1:
                while (index < boundary) {
                    matrix[i][ii] = value;
                    ii++;
                    index++;
                    value++;
                }
                spiral(matrix, value, ++i, --ii, --boundary, 2);
                break;
            case 2:
                while (index < boundary) {
                    matrix[i][ii] = value;
                    i++;
                    index++;
                    value++;
                }
                spiral(matrix, value, --i, --ii, boundary, 3);
                break;
            case 3:
                while (index < boundary) {
                    matrix[i][ii] = value;
                    ii--;
                    index++;
                    value++;
                }
                spiral(matrix, value, --i, ++ii, --boundary, 4);
                break;
            case 4:
                while (index < boundary) {
                    matrix[i][ii] = value;
                    i--;
                    index++;
                    value++;
                }
                spiral(matrix, value, ++i, ++ii, boundary, 1);
                break;
        }
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值