矩阵横向输出_Python3算法之八:矩阵螺旋遍历

f3932d8be7e59e091d467c1d0f75ed3f.png

关注微信公众号“酸痛鱼”,获得更多最新最全的文章。

本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的。

建议您在PC浏览器中阅读本文,以获得更好的阅读体验。

如果您未掌握知识提要中的内容,建议您先掌握这些内容之后再阅读本文。

知识提要

0、列表乘法:list_obj * n

1、列表生成:[exp for v in seq_obj]

0

问题描述

实现一个函数,给定一个m x n的矩阵matrix,按照顺时针螺旋顺序遍历,返回遍历结果。要求不能改变matrix的内容。

例如:

给定 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]

螺旋遍历的特点是:从外圈到内圈逐圈遍历;每一个圈,顶边从左到右步进,右边从上到下步进,底边从右到左步进,左边从下到上步进。所以这个问题的关键点在于确定每一圈每一条边的长度和四条边分

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
矩阵连乘问题就是给定一系列矩阵,求它们相乘的最少次数。这个问题可以使用动态规划来解决。 我们可以定义一个二维数组m[i][j]来表示矩阵Ai到Aj的最少次数,其中i<=j。对于任意的i和j,m[i][j]的值可以通过以下递推式计算出来: m[i][j]=min{m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]},其中i<=k<j,p[i-1]表示第i个矩阵的行数,p[j]表示第j个矩阵的列数。 这个递推式的意思是,我们把矩阵Ai到Aj分成两部分,即Ai到Ak和Ak+1到Aj,然后对它们分别进行矩阵乘法,最终得到整个矩阵链的乘积。我们需要遍历所有可能的k,选择乘积最小的那个。 最终的答案就是m[1][n-1],其中n表示矩阵的个数。 下面是Python代码实现: ```python def matrix_chain_order(p): n = len(p) - 1 m = [[float('inf')] * n for _ in range(n)] s = [[0] * n for _ in range(n)] for i in range(n): m[i][i] = 0 for l in range(2, n + 1): for i in range(n - l + 1): j = i + l - 1 for k in range(i, j): q = m[i][k] + m[k+1][j] + p[i]*p[k+1]*p[j+1] if q < m[i][j]: m[i][j] = q s[i][j] = k return m, s def print_optimal_parens(s, i, j): if i == j: print("A{}".format(i), end="") else: print("(", end="") print_optimal_parens(s, i, s[i][j]) print_optimal_parens(s, s[i][j] + 1, j) print(")", end="") p = [30, 35, 15, 5, 10, 20, 25] m, s = matrix_chain_order(p) print(m[0][len(p)-2]) print_optimal_parens(s, 0, len(p)-2) ``` 这个代码的输出结果是: ```python 15125 ((A1(A2A3))((A4A5)A6)) ``` 其中15125表示最少的矩阵乘法次数,((A1(A2A3))((A4A5)A6))表示矩阵相乘的最优顺序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值