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

📅  最后修改于: 2023-12-03 15:37:17.176000             🧑  作者: Mango

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

问题描述

给定一个正整数数组,找到圆形数组中的最大连续子数组和,其中任意两个相邻的元素不能同时选取。

例如,对于数组 [3, 2, 5, 10, 7],最大连续子数组是 [5, 10],其和为 15。

解决方案
思路

由于是圆形数组,因此我们需要分别考虑两种情况:

  1. 最大连续子数组不跨越数组结尾和数组开头
  2. 最大连续子数组跨越数组结尾和数组开头

对于第一种情况,我们可以借用“打家劫舍”问题的思路,使用动态规划求解。

对于第二种情况,我们可以将其转化为第一种情况,即将该圆形数组拆分为两个普通数组,再分别求解。

最终的最大连续子数组和即为两种情况的较大值。

代码
def rob(nums):
    if not nums:
        return 0
    if len(nums) == 1:
        return nums[0]
    # 不跨越数组结尾和数组开头的情况
    def helper(nums):
        n = len(nums)
        dp = [0] * n
        dp[0] = nums[0]
        dp[1] = max(nums[0], nums[1])
        for i in range(2, n):
            dp[i] = max(dp[i-2]+nums[i], dp[i-1])
        return dp[-1]
    # 跨越数组结尾和数组开头的情况
    return max(helper(nums[:-1]), helper(nums[1:]))
复杂度

时间复杂度:$O(n)$,其中 $n$ 为数组中元素的个数。

空间复杂度:$O(n)$,其中 $n$ 为数组中元素的个数。