返回

从 LeetCode 探索数组三角和的解法

后端

LeetCode 数组三角和题干剖析

给你一个下标从 0 开始的整数数组 nums ,nums[i] 是 0 到 9 之间(两者都包含)的一个数字。

该数组可以看作一个三角形,其中第 i 行包含 nums[0], nums[1], ..., nums[i] 这些数字。

三角形的最顶端是元素 nums[0],最底端是元素 nums[nums.length - 1],最底端一行包含 nums[nums.length - 1] 个元素,倒数第二行包含 nums[nums.length - 2] 个元素,以此类推。

一个数组三角形的总和是每一行数字之和。

求出这个数组三角形的最大总和。

解题思路:动态规划

数组三角和问题可以用动态规划的思想来解决。

我们可以定义一个二维数组 dp,其中 dp[i][j] 表示从第 i 行第 j 列到三角形底部的最大总和。

初始化:

dp[nums.length - 1][j] = nums[j],其中 j = 0, 1, ..., nums.length - 1。

状态转移方程:

对于 i = nums.length - 2, nums.length - 3, ..., 0 和 j = 0, 1, ..., i,

dp[i][j] = nums[j] + max(dp[i+1][j], dp[i+1][j+1])

最终答案:

最大的三角形和是 dp[0][0]。

代码实现:

def maximum_triangle_sum(nums):
  n = len(nums)
  dp = [[0] * n for _ in range(n)]

  # 初始化
  for i in range(n):
    dp[n - 1][i] = nums[i]

  # 状态转移
  for i in range(n - 2, -1, -1):
    for j in range(i + 1):
      dp[i][j] = nums[j] + max(dp[i + 1][j], dp[i + 1][j + 1])

  # 返回最大的三角形和
  return dp[0][0]


# 测试用例
nums = [2, 3, 4, 5, 6, 7, 8, 9, 10]
result = maximum_triangle_sum(nums)
print(result)  # 输出:45

总结

数组三角和问题是一个经典的动态规划问题。通过使用动态规划的思想,我们可以高效地求出数组三角形的最大总和。

本文提供了该问题的详细讲解和代码实现,帮助你更好地理解和解决此类问题。