最大子串的长度加起来为S.

时间:2016-03-01 22:31:22

标签: arrays algorithm sub-array

我在接受采访时被问到以下问题,但我无法给出最佳答案。

问题:编写一个程序,可以找到总和最大的连续子数组的长度。给定一个可变大小的数组和一个整数。

输入:1。可变大小的数组,只能有{-1,0,1}个元素。

示例:A [] = {1,0,0,1,-1,1,1,1,1}

  1. 整数S,
  2. 示例: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:我提出的问题没有版权问题。

3 个答案:

答案 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的值的数量来解决问题。然后应用公式。有什么影响:

  • 全力以赴。
  • 确保你有足够的1s(正面,负数为-1)。
  • 如果没有,请输出错误。
  • 然后选择正确的1s / -1s数,以便用尽所有“其他值”

最后一点是故意有点模糊(你可以通过编写一些例子来考虑它。)

关键是,使用三个值,您可以填充这三个值。然后你可以使用一些规则来获得最长的适当总和。

答案 2 :(得分:1)

算法概要:

  1. 定义Lo [x]为最长前缀总和的长度,其总和为x
  2. 定义Sh [x]为最短前缀和的长度,其总和为x
  3. 对所有x的Ans = max(Lo [x + S] - Sh [x]),可以通过循环数组找到一次
  4. Lo[]& Sh[]的内存大小均为O(n),因为所有元素都在{-1,0,1}

    要处理负和,其中一种方法是将范围-n..n映射到0..2n,以便索引x可以表示(两个数组的大小因此{{1 }} = O(2n)

    要计算前缀和,只需遍历数组一次,然后更新数组O(n)& Lo[]可以在Sh[]

    中计算