最近我一直在努力解决以下问题:
给定一个整数数组,找到一个总和至少为 k 的最小(最短长度)子数组。
显然,这可以在 O(n^2) 中轻松完成。我能够编写一个算法,以线性时间解决自然数的问题,但我无法弄清楚整数。
我最近的尝试是这样的:
def find_minimal_length_subarr_z(arr, min_sum):
found = False
start = end = cur_end = cur_sum = 0
for cur_start in range(len(arr)):
if cur_end <= cur_start:
cur_end, cur_sum = cur_start, arr[cur_start]
else:
cur_sum -= arr[cur_start-1]
# Expand
while cur_sum < min_sum and cur_end < len(arr)-1:
cur_end += 1
cur_sum += arr[cur_end]
# Contract
while cur_end > cur_start:
new_sum = cur_sum - arr[cur_end]
if new_sum >= min_sum or new_sum >= cur_sum:
cur_end -= 1
cur_sum = new_sum
else:
break
if cur_sum >= min_sum and (not found or cur_end-cur_start < end-start):
start, end, found = cur_start, cur_end, True
if found:
return start, end
例如:
[8, -7, 5, 5, 4], 12 => (2, 4)
但是,它失败了:
[-12, 2, 2, -12, 2, 0], 4
正确的结果在哪里,(1, 2)
但算法找不到。
这完全可以在线性时间内完成(最好具有恒定的空间复杂度)吗?