一、628. 三个数的最大乘积
1.排序
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
# 排序
nums.sort(reverse = True)
a, b, c, m, n = nums[0], nums[1], nums[2], nums[-1], nums[-2]
# if a <= 0:
# # 全为负,返回答案只能为负
# return a * b * c
# else:
# # 不全为负,返回答案为正
# return a * max(b * c, m * n)
return max(a * b * c, a * m * n)
2.模拟
维护最大三位和最小两位
class Solution:
def maximumProduct(self, nums: List[int]) -> int:
# 模拟,维护最大三位和最小两位
a, b, c, m, n = -inf, -inf, -inf, inf, inf
for x in nums:
if x > a:
a, b, c = x, a, b
elif x > b:
b, c = x, b
elif x > c:
c = x
if x < m:
m, n = x, m
elif x < n:
n = x
# if a <= 0:
# # 全为负,返回答案只能为负
# return a * b * c
# else:
# # 不全为负,返回答案为正
# return a * max(b * c, m * n)
return max(a * b * c, a * m * n)
二、118. 杨辉三角
1.模拟
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
# 模拟
if numRows == 1 or numRows == 2:
return [[1] * (i + 1) for i in range(numRows)]
ans = [[1] * (i + 1) for i in range(2)] # 前两行
# 从第三行开始
for _ in range(2, numRows):
row = []
for i in range(1, len(ans[-1])):
# 先计算得中间值
row.append(ans[-1][i] + ans[-1][i - 1])
# 再在两头添上1
ans.append([1] + row + [1])
return ans
2.错位相加
来自题解(. - 力扣(LeetCode)),学习一下。
class Solution:
def generate(self, numRows: int) -> List[List[int]]:
# 错位相加
ans = [[1]]
while len(ans) < numRows:
# 用加0和zip函数实现错位
row = [a + b for a, b in zip([0] + ans[-1], ans[-1] + [0])]
ans.append(row)
return ans
三、119. 杨辉三角 II
1.模拟
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
# 模拟
# 时复O(rowIndex^2),空复O(rowIndex)(算上返回数组row)
row = [1]
while len(row) < rowIndex + 1:
# 行数从0开始编号
row = [0] + row
for i in range(len(row) - 1):
row[i] += row[i + 1]
# 最后一格没变,为1
return row
2.数学,线性递推
思路来自官方题解方法2(. - 力扣(LeetCode))。
class Solution:
def getRow(self, rowIndex: int) -> List[int]:
# 数学,线性递推
row = [1] * (rowIndex + 1)
for i in range(1, rowIndex):
# 最后一位也为1,可以不用更改
row[i] = row[i - 1] * (rowIndex - i + 1) // i
return row
完
感谢你看到这里!一起加油吧!