📅  最后修改于: 2023-12-03 15:37:17.176000             🧑  作者: Mango
给定一个正整数数组,找到圆形数组中的最大连续子数组和,其中任意两个相邻的元素不能同时选取。
例如,对于数组 [3, 2, 5, 10, 7],最大连续子数组是 [5, 10],其和为 15。
由于是圆形数组,因此我们需要分别考虑两种情况:
对于第一种情况,我们可以借用“打家劫舍”问题的思路,使用动态规划求解。
对于第二种情况,我们可以将其转化为第一种情况,即将该圆形数组拆分为两个普通数组,再分别求解。
最终的最大连续子数组和即为两种情况的较大值。
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$ 为数组中元素的个数。