返回
力扣算法题每日一刷:6034. 数组的三角和(中等)
前端
2023-11-28 02:32:44
每日力扣算法题:数组的三角和
算法分析
本题可以用动态规划的思想来解决。
状态定义:
- dp[i][remainder]:表示考虑 nums[0] 到 nums[i] 这些元素,且当前余数为 remainder 时,三角和的数目。
状态转移方程:
- nums[i] 不参与三角和: dp[i][remainder] = dp[i-1][remainder]
- nums[i] 参与三角和:
- 如果 remainder = 0,则 dp[i][remainder] += dp[i-1][0]
- 否则,则 dp[i][remainder] += dp[i-1][10 - remainder]
初始化:
- dp[0][remainder] = 0,其中 remainder = 0, 1, ..., 9
计算顺序:
- 遍历数组 nums,从 i = 1 到 n
- 遍历余数 remainder,从 0 到 9
结果:
- 答案为 dp[n-1][0]
代码实现
def triangle_sum(nums):
n = len(nums)
dp = [[0] * 10 for _ in range(n+1)]
for i in range(1, n+1):
for remainder in range(10):
dp[i][remainder] = dp[i-1][remainder]
if nums[i-1] != 0:
if remainder == 0:
dp[i][remainder] += dp[i-1][0]
else:
dp[i][remainder] += dp[i-1][10 - remainder]
return dp[n-1][0]
时间复杂度
动态规划算法的时间复杂度为 O(n * r),其中 n 是数组的长度,r 是余数的个数(10 个)。
空间复杂度
动态规划算法的空间复杂度为 O(n * r),其中 n 是数组的长度,r 是余数的个数(10 个)。