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

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

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

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

知识提要

1、range、lambda、reduce

2、二项式系数、组合数、杨辉三角

3、列表过滤语法

0

问题描述

杨辉三角,是二项式系数在三角形中的一种几何排列。给定一个非负索引n,返回杨辉三角的第n行。

例如:

输入:0

返回:[1]

输入:1

返回:[1, 1]

输入:2

返回:[1, 2, 1]

杨辉三解又叫Pascal’s Triangle,为了表述方便,在下文中,我们将用P(n)来代码杨辉三解的第n行。

1

问题分析

二项式系数,是二项(x+y)^n展开后各项的系数,第r列的值为C(n, r)。

杨辉三角是二项系数的几何排列,其相临两个行存在递推关系,如动图所示(图片来源于网络,若侵权,请通知删除),以及组合数的性质,我们可以推算出如下递推规律:

C(n, 0) = 1

C(n, n) = 1

C(n, r) = C(n - 1, r – 1) + C(n – 1, r) # n>1且r>0

所以,我们解决此题目的方式有两种,一种是公式法,一种是递推法。我们将首先介绍公式法,然后介绍递推法。本文的重点是介绍递推法,我们将一步步地简化递推法的空间复杂度。

2

公式法

根据二项式展开式的规律,我们知道:

P(n) = [C(n, 0), C(n, 1), …, C(n, n)]

所以我们只需要实现一个求组合数的函数即可以解决问题。

from functools import reduce

# 获取组合数C(n, m)

def combination(n, m):

if n <= m or m <= 0: return 1

if m > n / 2:

m = n - m

func = lambda a, b: a * b

val1 = reduce(func, range(m + 1, n + 1))

val2 = reduce(func, range(1, n - m + 1))

return val1 // val2

# 获取杨辉三角第n行

def GetTriangleRow(n):

return [combination(n, i) for i in range(n + 1)]

3

递推法

我们可以根据递推规律,构建杨辉三角,返回杨辉三角的最后一行即可。

# 获取杨辉三角第n行

def GetTriangleRow(n):

matrix = [[1] * (col + 1) for col in range(0, n + 1)]

for row in range(2, n + 1):

for col in range(1, row):

matrix[row][col] = matrix[row - 1][col - 1] + matrix[row - 1][col]

return matrix[n]

4

空间复杂度为O(n)的递推法

在第3节中,构建杨辉三角,需要存储大量额外临时空间matrix,matrix的元素数量为n(n+1)/2,所以空间复杂度为O(n^2)。

实际上,根据递推公式,我们只需要不停地存储P(n-1)和P(n)的结果即可,用此方法,空间复杂度可以降低为O(n)。虽然我们用到的空间是2n,但O(2n)也是O(n)。

def GetTriangleRow(n):

size = n + 1

result = [1] * size

for cols in range(3, size + 1):

cur_row = [1] * cols

for j in range(1, cols - 1):

cur_row[j] = result[j - 1] + result[j]

result = cur_row

return res

5

进一步减少递推法的空间复杂度

在第4节中,我们已经达到现了O(2n)的空间复杂度的效果。但如果我们非得实现真正意义上的O(n)也是可以做到的。

组合数公式有如下的规律:

C(n, r) = C(n, n – r)

根据这个规律,我们可以一开始便初始化P(n)的空间。在每一次迭代中,用P(i-1)的后一半的数值来推算出P(i)前一半的数值,并将P(i)前一半的结果存储在原来存储P(i-1)前一半数值的地方。最后用P(i)前一半得到P(i)后一半的结果。

由于P(i-1)中间项的值有可能会在推算P(i)的过程中被覆盖,所以我们需要首先单独推算并存储P(i)的中间一项。请关注代码中的mid_val变量。

def GetTriangleRow(n):

size = n + 1

result = [1] * size

for cols in range(2, size):

m = cols // 2

mid_val = result[m - 1] + result[m]

for j in range(1, m):

result[j] = result[cols - j] + result[cols - j - 1]

result[m] = mid_val

for j in range(m + 1, cols):

result[j] = result[cols - j]

return result● 扫码关注我嗄嘎嘎

python杨辉三角函数_Python算法之六:杨辉三角相关推荐

  1. python如何使用三角函数_Python中计算三角函数之cos()方法的使用简介

    Python中计算三角函数之cos()方法的使用简介 这篇文章主要介绍了Python中计算三角函数之cos()方法的使用简介,是Python入门的基础知识,需要的朋友可以参考下 cos()方法返回x弧 ...

  2. python实现杨辉三角_Python算法之六:杨辉三角

    关注微信公众号"酸痛鱼",获得更多最新最全的文章. 本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的. 建议您在PC浏览器中阅读本文,以获得更好的 ...

  3. python杨辉三角函数_python杨辉三角输出指定行_使用python打印十行杨辉三角过程详解...

    如何用python输出杨辉三角 程序输出需要实现如下效果: [1] [1,1] [1,2,1] [1,3,3,1] .. 方法:迭代,生成器 12345678910111213141516171819 ...

  4. python的编码表_Python算法之旅列表的纷争之二进制编码

    列表的纷争之二进制编码 小美:最近数学老师给我们玩了有趣的猜年龄游戏,他显示了6张表格,你只要观察这6张表格,然后回答"是"与"不是"就可以了.老师可以根据你的 ...

  5. python count函数时间复杂度_Python(算法)-时间复杂度和空间复杂度

    时间复杂度 算法的时间复杂度是一个函数,它定量描述了该算法的运行时间,时间复杂度常用"O"表述,使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况 时间 ...

  6. python求数组最大值_Python算法与数据结构--求所有子数组的和的最大值

    Python算法与数据结构--求所有子数组的和的最大值 玄魂工作室秘书 玄魂工作室 昨天 题目:输入一个整形数组,数组里有正数也有负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. ...

  7. python 递归 写平方_Python算法:推导、递归和规约

    注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心知识:Induction(推导).R ...

  8. python求梅花数_python 算法

    算法的复杂度 算法的时间复杂度是指算法需要消耗的时间资源 时间复杂度用"O(数量级)"来表示 常见的时间复杂度有: O(1)常数阶: 问题规模越大效率越高,时间不变, a = [1 ...

  9. python遍历数组冒泡排序_Python算法(一) 数组冒泡排序(难度等级:easy)

    冒泡排序(Bubble Sort)是一种典型的交换排序算法,通过交换数据元素的位置进行排序. 算法原理:从无序序列头部开始,进行两两比较,根据大小交换位置,直到最后将最大(小)的数据元素交换到了无序队 ...

最新文章

  1. 保存数组_面试官:讲一讲你对据结构——数组、链表、栈、队列的理解
  2. python学习框架图-从零搭建深度学习框架(二)用Python实现计算图和自动微分
  3. IM群聊消息如此复杂,如何保证不丢不重?
  4. 数据结构与算法 / UUID 和 GUID 区别和联系
  5. springMVC解析视图
  6. 源码编译依赖关系一例小结
  7. Linux 免密码sudo
  8. 几个互联网巨头的社区团购还不收手?
  9. 计算机98k音乐,【土豆】handclap 98K 完整版
  10. 如何将网页实现变灰效果?
  11. Python:提高pip安装速度的网站
  12. Atitit 施政策略总结 目录 1. 行政综合方面的策略 2 1.1. 加强宣传无处不在策略 占领各大网络与实体阵地 2 1.2. 装点门面,不花钱或者少花钱的东西体系全部搞起来 2 1.3. 加大
  13. 考研复试(控制工程专硕)及大学本科(物联网工程)知识点回顾(三)——模拟电子技术
  14. 如何关闭联想电脑的大小写切换桌面提示
  15. 前端国密加解密使用方法SM2、SM3、SM4
  16. VSTO Ribbons的完整介绍
  17. 【PS基础教程】PS制作圆形小图标
  18. 数学与神经网络关系大吗,神经网络与算法的关系
  19. ZYNQ中PS、PL的含义
  20. 2020年 TPAMI长文, Ball k-means:一种无界的快速自适应精确k-means算法

热门文章

  1. 老男孩python14期全套-老男孩第十四期Python学习班之Day01
  2. python在线学习直播-Python在线学习最有效马哥开启全网独家全程直播课
  3. 学python能做什么类型的工作-做自动化,学python要到那种程度呢?
  4. python 菜鸟-Python3 集合
  5. 《解析深度学习:语音识别实践》.pdf
  6. 语音识别结合应用场景之后
  7. win10wifi多了数字_win10系统电脑查看wifi密码是多少的方法
  8. 远程计算机用户端口,电脑怎么开远程端口
  9. java新的日期_java8你应该了解的新特性(新时间与日期API)
  10. vue-drag-resize + html2canvas合成图片并下载