力扣题目118,关于杨辉三角的计算方式。
给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
示例 1:
输入: numRows = 5
输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]
示例 2:
输入: numRows = 1
输出: [[1]]
这道题这一层的信息跟上一层有很大的关系,这题就很适合于写动态规划的题目。三角形看起来就是一个二维数组,索引值和数组的容量相关的一个数组,其中,大多数的值都是有效的。
也即,生成一个有相同大小的值,其中,初始化可以直接是1,因为需要计算的地方都会被覆盖,并且本身周边区域的赋值就都是1。
dp = [[1] * n for n in range(numRows)]
随后,设定迭代方式,肯定需要两个指针,一个约束层数,一个约束每一层的任何指数,约束条件是层数和每层的个数。
for i in range(numRows):
for j in range(i):
dp[i][j] = dp[i-1][j] + d[i-1][j-1]
同样,还需要约束条件,这里的条件就是判断是否满足处于中间地方的目的,而不是边缘区域,
可以是
if j - 1 < 0 or j + 1 > i:
continue
#2
if i == 0 or j == 0:
continue
两种方式都可以。附带完整代码。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
dp = [[1] * i for i in range(1,1+numRows)]
if numRows <= 2:return dp
for i in range(numRows):
for j in range(i):
if j - 1 < 0 or j + 1> i:
continue
dp[i][j] = dp[i-1][j-1] + dp[i-1][j]
return dp
三角形最小路径和的题目
从下往上进行遍历,寻找到一个符合条件的数,也就是这一行的状态变成依据下一行的叠加状态,不断去叠加形成值。
class Solution:
def minimunTotal(self, traigle):
for i in range(len(traigle), 0, -1):
for j in range(i):
traigle[i-1][j] = min(traigle[i][j],traigle[i][j-1])
return res