返回

力扣算法题每日一刷:6034. 数组的三角和(中等)

前端

每日力扣算法题:数组的三角和

算法分析

本题可以用动态规划的思想来解决。

状态定义:

  • 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 个)。