我在接受采访时被问到以下问题,但我无法给出最佳答案。
问题:编写一个程序,可以找到总和最大的连续子数组的长度。给定一个可变大小的数组和一个整数。
输入:1。可变大小的数组,只能有{-1,0,1}个元素。
示例:A [] = {1,0,0,1,-1,1,1,1,1}
示例:S = 4
输出:8
说明:A的最大连续子数组,加起来为S = 4:{1,0,0,1,-1,1,1,1}或{0,0,1,-1,1 ,1,1,1}
约束:应在O(N)
中完成我已经解决了这个问题,但无法满足时间的复杂性。任何人都可以帮助解决O(N)中的问题。
PS:我提出的问题没有版权问题。
答案 0 :(得分:3)
迭代虽然数组存储了变量中当前元素的总和。对于每个和值,将它放在O(1)中的哈希表中(如果它还没有),映射到它出现的索引。
但是,在每次插入之前,检查哈希表是否已包含current_sum - S.如果包含,则表示子数组[previous_index + 1..current_index]具有和S.
即使数组包含{-1,0,1}以外的元素,也能正常工作。
这是一个示例Python代码:
def solve(A, S):
table = {0: 0}
answer = None
total = 0
for i, x in enumerate(A):
total += x
if total - S in table:
candidate = (table[total-S], i)
if answer is None or candidate[1] - candidate[0] > answer[1] - answer[0]:
answer = candidate
if total not in table:
table[total] = i+1
return answer
print solve([-1, 0, 1, 1, 1, 1, 1, 0, 0, 1], 4)
答案 1 :(得分:1)
如果只有三个值是-1,0和1,那么您可以通过计算-1,0和1的值的数量来解决问题。然后应用公式。有什么影响:
最后一点是故意有点模糊(你可以通过编写一些例子来考虑它。)
关键是,使用三个值,您可以填充这三个值。然后你可以使用一些规则来获得最长的适当总和。
答案 2 :(得分:1)
算法概要:
Lo[]
& Sh[]
的内存大小均为O(n)
,因为所有元素都在{-1,0,1}
要处理负和,其中一种方法是将范围-n..n
映射到0..2n
,以便索引x
可以表示(两个数组的大小因此{{1 }} = O(2n)
)
要计算前缀和,只需遍历数组一次,然后更新数组O(n)
& Lo[]
可以在Sh[]