📌  相关文章
📜  圆形数组中的最大和,使得没有两个元素相邻|套装2(1)

📅  最后修改于: 2023-12-03 14:50:49.894000             🧑  作者: Mango

圆形数组中的最大和,使得没有两个元素相邻 | 套装2

简介

这个问题是一个动态规划问题,要求给定一个圆形数组,寻找一种方式选取数字,使得选取的数字之间没有相邻关系,并且选取的数字之和最大。

问题描述

给定一个长度为 n 的正整数数组,从数组中选取数字构成一个圆形数组。要求选取的数字之间不能相邻,即相隔至少一个数字。请计算最大的可能数字之和。

解题思路

为了求解最大的数字之和,我们可以使用动态规划的方法。我们可以使用两个变量 includeexclude,分别表示当前数字被选取和不被选取时的最大数字之和。

  • 对于第一个数字,可以选择选取或者不选取。因此,include[0] 等于第一个数字,而 exclude[0] 为0。
  • 对于第二个数字,我们可以选择不选取它,即 exclude[1] = max(include[0], exclude[0])。或者选择选取它,即 include[1] = exclude[0] + a[1]
  • 对于后续的数字,我们可以选择不选取它,即 exclude[i] = max(include[i-1], exclude[i-1])。或者选择选取它,即 include[i] = exclude[i-1] + a[i]

最后,我们只需比较 include[n-1]exclude[n-1] 的大小,选取较大值作为最终的结果。

代码实现
def max_sum_circular_subarray(nums):
    n = len(nums)
    if n == 0:
        return 0
    if n == 1:
        return nums[0]
    
    include = [0] * n
    exclude = [0] * n
    
    # Calculate include and exclude for the first number
    include[0] = nums[0]
    exclude[0] = 0
    
    # Calculate include and exclude for the second number
    include[1] = nums[1]
    exclude[1] = max(nums[0], nums[1])
    
    for i in range(2, n):
        include[i] = max(exclude[i-1] + nums[i], include[i-1])
        exclude[i] = max(include[i-1], exclude[i-1])
    
    return max(include[n-1], exclude[n-1])

# Example usage
nums = [3, 2, 5, 10, 7]
result = max_sum_circular_subarray(nums)
print(result)
复杂度分析
  • 时间复杂度:O(n),需要遍历数组一次。
  • 空间复杂度:O(n),需要使用两个长度为 n 的数组来存储结果。