算法题-螺旋矩阵

题目描述:

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路:

参照leetcode krahets的思路,根据示例的输出方式看,顺时针打印矩阵的顺序是“从左向右、从上向下、从右向左、从上向下”依次循环。

因此,可以设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。

步骤:

1、空值处理:当matrix为空时,直接返回空列表即可。

2、初始化:矩阵左、右、上、下四个边界为l、r、t、b,l,l和t为起点坐标0,r和b分别为初始矩阵的列数-1和行数-1,相当于下标,以及用于打印结果列表res。

3、判断边界是否相遇(是否打印完毕),若打印完毕则跳出。

4、返回结果res

打印方向                1.根据边界打印2.边界向内收缩     3.是否打印完毕
从左向右        左边界l,右边界r上边界t加1 相当于上边一行打印完就去掉是否t>b,表示上下边界重合
从上向下        上边界t,下边界b右边界r减1 相当于右边一列打印完就去掉是否l>r,表示左右边界重合
从右向左   右边界r,左边界l下边界b减1 相当于下边一行打印完去掉是否t>b,表示上下边界重合
从下向上下边界b,上边界t左边界l加1,相当于左边列打印完去掉是否l>r,表示左右边界重合

python:

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:
            return []
        l, r, t, b = 0, len(matrix[0]) - 1, 0, len(matrix) - 1
        res = []

        while True:

            for i in range(l, r + 1):
                res.append(matrix[t][i]) # left to right
            t += 1
            if t > b:
                break
            for i in range(t, b + 1):
                res.append(matrix[i][r]) # top to bottom
            r -= 1
            if l > r:
                break
            for i in range(r, l - 1, -1):
                res.append(matrix[b][i]) # right to left
            b -= 1
            if t > b:
                break
            for i in range(b, t - 1, -1):
                res.append(matrix[i][l]) # bottom to top
            l += 1
            if l > r:
                break
        return res

结果:java:

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if (matrix.length == 0) 
            return new ArrayList<Integer>();

        int l = 0, r = matrix[0].length - 1, t = 0, b = matrix.length - 1, x = 0;
        Integer[] res = new Integer[(r + 1) * (b + 1)];
        while (true) {
            for (int i = l; i <= r; i++) res[x++] = matrix[t][i]; // left to right
            if (++t > b) break;
            for (int i = t; i <= b; i++) res[x++] = matrix[i][r]; // top to bottom
            if (l > --r) break;
            for (int i = r; i >= l; i--) res[x++] = matrix[b][i]; // right to left
            if (t >--b) break;
            for (int i = b; i >= t; i--) res[x++] = matrix[i][l]; // bottom to top
            if (++l > r) break;
        }
        return Arrays.asList(res);


    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值