LeetCode 413. Arithmetic Slices(等差数列划分)
LeetCode 446. Arithmetic Slices II - Subsequence(等差数列划分 II - 子序列)
其他动态规划的应用实例:
动态规划的应用(一):最短路问题
动态规划的应用(二):cutting stock 问题
动态规划的应用(三):字符串相关问题
动态规划的应用(四):LeetCode 1900. 最佳运动员的比拼回合
动态规划的应用(六):矩阵相关问题
413. Arithmetic Slices(等差数列划分)
问题描述
思路与代码
动态规划:存储中间结果
看到题自然地想到了动态规划。
由于在迭代过程中,每增加一个元素,如果该元素与前两项组成的子数列为等差数列,那么之前找到的所有含有前两项的等差子数列均会产生一个新等差子数列。因此笔者定义了一个列表,以存储所有找到的等差子数列以便于操作:
class Solution:
def numberOfArithmeticSlices(self, nums: List[int]) -> int:
def dp(array: List[int]) -> List[List[int]]:
"""
动态规划的递归函数
:param array: 数列
:return: 等差子数列的列表
"""
# special case 1: 长度小于 3 时,返回空
if len(array) < 3:
return []
# special case 2: 长度为 3 时,判断是否为等差数列
elif len(array) == 3:
if array[2] - array[1] == array[1] - array[0]:
return [[0, 1, 2]]
else:
return []
else:
list_sub = dp(array=array[: -1])
list_sub_add = []
if array[-1] - array[-2] =