Google Interview: Find all contiguous subsequence in a given array of integers, whose sum falls in the given range. Can we do better than O(n^2)?

前端 未结 7 486
误落风尘
误落风尘 2021-01-30 02:35

Given an array of Integers, and a range (low, high), find all contiguous subsequence in the array which have sum in the range.

Is there a solution b

7条回答
  •  傲寒
    傲寒 (楼主)
    2021-01-30 03:07

    O(n) time solution:

    You can extend the 'two pointer' idea for the 'exact' version of the problem. We will maintain variables a and b such that all intervals on the form xs[i,a), xs[i,a+1), ..., xs[i,b-1) have a sum in the sought after range [lo, hi].

    a, b = 0, 0
    for i in range(n):
        while a != (n+1) and sum(xs[i:a]) < lo:
            a += 1
        while b != (n+1) and sum(xs[i:b]) <= hi:
            b += 1
        for j in range(a, b):
            print(xs[i:j])
    

    This is actually O(n^2) because of the sum, but we can easily fix that by first calculating the prefix sums ps such that ps[i] = sum(xs[:i]). Then sum(xs[i:j]) is simply ps[j]-ps[i].

    Here is an example of running the above code on [2, 5, 1, 1, 2, 2, 3, 4, 8, 2] with [lo, hi] = [3, 6]:

    [5]
    [5, 1]
    [1, 1, 2]
    [1, 1, 2, 2]
    [1, 2]
    [1, 2, 2]
    [2, 2]
    [2, 3]
    [3]
    [4]
    

    This runs in time O(n + t), where t is the size of the output. As some have noticed, the output can be as large as t = n^2, namely if all contiguous subsequences are matched.

    If we allow writing the output in a compressed format (output pairs a,b of which all subsequences are contiguous) we can get a pure O(n) time algorithm.

提交回复
热议问题