🌈 搜索
📅 最后修改于: 2023-12-03 15:37:52.469000 🧑 作者: Mango
给定一个整数数组,找到大小为 K 的最大圆形子数组和。圆形子数组是按照循环方式截取的,例如,如果数组中有n个元素,则第一个元素紧接着最后一个元素。子数组和是指选取的子数组中包含的元素之和。
该算法的目标是在数组中找到最大的子数组和,然后将其“封装”为一个圆形子数组。具体步骤如下:
具体实现细节可见下方代码。
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)。