📜  大小为 K 的最大圆形子数组和(1)

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

大小为 K 的最大圆形子数组和

介绍

给定一个整数数组,找到大小为 K 的最大圆形子数组和。圆形子数组是按照循环方式截取的,例如,如果数组中有n个元素,则第一个元素紧接着最后一个元素。子数组和是指选取的子数组中包含的元素之和。

算法思路

该算法的目标是在数组中找到最大的子数组和,然后将其“封装”为一个圆形子数组。具体步骤如下:

  1. 如果K等于数组的长度,则直接返回所有元素之和
  2. 分别计算包含第一个元素和最后一个元素的所有子数组和,并记录最大值。
  3. 当2中的最大值为负数时,直接返回此值。
  4. 若2中的最大值为正数,令该值为sum1
  5. 找到不包括第一个元素和最后一个元素的大小为K的最大子数组和sum2。
  6. 最终结果为max(sum1, sum1 + sum2)

具体实现细节可见下方代码。

代码实现
def max_circular_subarray(nums: List[int], k: int) -> int:
    n = len(nums)
    if k == n:
        return sum(nums)
    
    # 计算包含第一个元素和最后一个元素的最大子数组和
    max_sum1 = float('-inf')
    tmp_sum1 = 0
    for i in range(n):
        tmp_sum1 += nums[i]
        if i >= k:
            tmp_sum1 -= nums[i-k]
        if i >= k-1:
            max_sum1 = max(max_sum1, tmp_sum1)
    
    # 当包含第一个元素和最后一个元素的最大子数组和为负数时,直接返回此值
    if max_sum1 <= 0:
        return max_sum1
    
    # 找到不包括第一个元素和最后一个元素的大小为K的最大子数组和
    max_sum2 = float('-inf')
    tmp_sum2 = 0
    for i in range(1, n-k+1):
        tmp_sum2 = max(tmp_sum2+nums[i], nums[i])
        max_sum2 = max(max_sum2, tmp_sum2)
    
    # 返回最终结果
    return max(max_sum1, max_sum1+max_sum2)
时间复杂度

该算法需要遍历整个数组两次,因此时间复杂度为O(n)。