ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

螺旋遍历和生成矩阵

2022-06-17 10:35:18  阅读:143  来源: 互联网

标签:None 遍历 matrix 螺旋 矩阵 len range


class Matrix:
    @staticmethod
    def spiral_matrix(matrix: list) -> list:
        """
        顺时针螺旋遍历矩阵
        :param matrix: 矩阵,二维列表
        :return: 遍历结果,一维列表
        """
        if not matrix:
            return
        m, n = len(matrix), len(matrix[0])
        try:
            for i in range(m):
                assert len(matrix[i]) == n
        except AssertionError:
            raise
        res, left, right, up, down = [], 0, n - 1, 0, m - 1
        # res长度 == m * n 则遍历结束
        while len(res) < m * n:
            # 从左向右遍历
            if up <= down:
                for j in range(left, right + 1):
                    res.append(matrix[up][j])
                up += 1
            # 从上向下遍历
            if left <= right:
                for i in range(up, down + 1):
                    res.append(matrix[i][right])
                right -= 1
            # 从右向左遍历
            if up <= down:
                for j in range(right, left-1, -1):
                    res.append(matrix[down][j])
                down -= 1
            # 从下向上遍历
            if left <= right:
                for i in range(down, up - 1, -1):
                    res.append(matrix[i][left])
                left += 1
        return res

    @staticmethod
    def generate_matrix(m: int, n: int) -> list:
        """
        顺时针生成m*n矩阵,包含元素 1 ~ m*n 所有元素
        :param m: 矩阵行
        :param n: 矩阵列
        :return:  矩阵,二维列表
        """
        if m <= 0 or n <= 0:
            return
        # 不能用 [[None] * n] * m 初始化  这种方式每行是引用的同一地址空间,修改列会影响所有行
        res = [[None for _ in range(n)] for _ in range(m)]
        left, right, up, down = 0, n - 1, 0, m - 1
        num = 1
        while num <= m * n:
            # 从左向右遍历
            if up <= down:
                for j in range(left, right + 1):
                    res[up][j] = num
                    num += 1
                up += 1
            # 从上向下遍历
            if left <= right:
                for i in range(up, down + 1):
                    res[i][right] = num
                    num += 1
                right -= 1
            # 从右向左遍历
            if up <= down:
                for j in range(right, left - 1, -1):
                    res[down][j] = num
                    num += 1
                down -= 1
            # 从下向上遍历
            if left <= right:
                for i in range(down, up - 1, -1):
                    res[i][left] = num
                    num += 1
                left += 1
        return res


if __name__ == '__main__':
    mt = Matrix()
    matrix_1 = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16], [17, 18, 19, 20]]
    print(mt.spiral_matrix(matrix_1))
    matrix_2 = mt.generate_matrix(5, 4)
    print(matrix_2)
    print(mt.spiral_matrix(matrix_2))

初始化矩阵:不能用[[None] * n] * m方式

实验:

res1 = [[None for _ in range(3)] for _ in range(2)]
for i in range(len(res1)):
    print('{}方式:第{}行地址为{}'.format('[[None for _ in range(3)] for _ in range(2)]', i, id(res1[i])))

print('-----------------')
res2 = [[None] * 3] * 2
for i in range(len(res2)):
    print('{}方式:第{}行地址为{}'.format('[[None] * 3] * 2', i, id(res2[i])))

输出:

[[None for _ in range(3)] for _ in range(2)]方式:第0行地址为4082224
[[None for _ in range(3)] for _ in range(2)]方式:第1行地址为14209192
-----------------
[[None] * 3] * 2方式:第0行地址为14209072
[[None] * 3] * 2方式:第1行地址为14209072

标签:None,遍历,matrix,螺旋,矩阵,len,range
来源: https://www.cnblogs.com/daxiacet/p/16384801.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有