时间:2020-6-6
题目地址:https://leetcode-cn.com/problems/pascals-triangle-ii/
题目难度:Easy
题目描述:
给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。
在杨辉三角中,每个数是它左上方和右上方的数的和。
示例:
输入: 3
输出: [1,3,3,1]
思路1:直接调用118的方法,输入对应行即可
代码段1:通过
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
list_i = []
for i in range(rowIndex + 1):
list_i.append([])
for j in range(i + 1):
if(j == 0 or j == i):
list_i[i].append(1)
else:
list_i[i].append(list_i[i-1][j-1] + list_i[i-1][j])
return list_i[rowIndex]
总结:
- 第一解法
思路2:直接算的时候想用递归来着,>10 就超时了,换成了计算,每次计算出除第一位的值
代码段2:通过
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
if rowIndex == 0: return [1]
res = [1, 1]
for i in range(2, rowIndex+1):
for j in range(i - 1):
res[j] += res[j + 1]
res = [1] + res
return res
总结:
- 这种解法看了好久,厉害了
- 我的递归写在下边了,还是没整出来,再往下是使用中间列表存储
# 超时的递归
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
result = []
temp_index = rowIndex
temp_index -= 1
for i in range(rowIndex + 1):
if(i == 0 or i == rowIndex):
result.append(1)
else:
temp = self.getRow(temp_index)
result.append(temp[i - 1] + temp[i])
return result
# 中间列表存储
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
if(rowIndex == 0): return [1]
result = [1, 1]
for i in range(2,rowIndex + 1):
temp = []
for j in range(i+1):
if(j == 0 or j == i):
temp.append(1)
else:
temp.append(result[j - 1] + result[j])
result = temp
return result
思路3:直接使用杨辉三角的特性,某行其实是上一行错位相加得到
如: 3 行 = 0 1 2 1 + 1 2 1 0 = 1 3 3 1
代码段3:通过
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
temp_list = [1]
temp = 1
while(temp < rowIndex +1):
temp_list = [sum(i) for i in zip([0] + temp_list, temp_list + [0])]
temp += 1
return temp_list
总结:
- 厉害了,算法还是需要数学功底的