How can I find the minimum index of the array in this case?

后端 未结 3 1119
长情又很酷
长情又很酷 2020-12-14 05:04

We are given an array with n values.

Example: [1,4,5,6,6]

For each index i of the array a ,we construct a

3条回答
  •  暗喜
    暗喜 (楼主)
    2020-12-14 05:28

    Here's an O(n √A)-time algorithm to compute the b array where n is the number of elements in the a array and A is the maximum element of the a array.

    This algorithm computes the difference sequence of the b array (∆b = b[0], b[1] - b[0], b[2] - b[1], ..., b[n-1] - b[n-2]) and derives b itself as the cumulative sums. Since the differences are linear, we can start with ∆b = 0, 0, ..., 0, loop over each element a[i], and add the difference sequence for [a[i]], [a[i]/2], [a[i]/3], ... at the appropriate spot. The key is that this difference sequence is sparse (less than 2√a[i] elements). For example, for a[i] = 36,

    >>> [36//j for j in range(1,37)]
    [36, 18, 12, 9, 7, 6, 5, 4, 4, 3, 3, 3, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
    >>> list(map(operator.sub,_,[0]+_[:-1]))
    [36, -18, -6, -3, -2, -1, -1, -1, 0, -1, 0, 0, -1, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    

    We can derive the difference sequence from a subroutine that, given a positive integer r, returns all maximal pairs of positive integers (p, q) such that pq ≤ r.

    See complete Python code below.

    def maximal_pairs(r):
        p = 1
        q = r
        while p < q:
            yield (p, q)
            p += 1
            q = r // p
        while q > 0:
            p = r // q
            yield (p, q)
            q -= 1
    
    
    def compute_b_fast(a):
        n = len(a)
        delta_b = [0] * n
        for i, ai in enumerate(a):
            previous_j = i
            for p, q in maximal_pairs(ai):
                delta_b[previous_j] += q
                j = i + p
                if j >= n:
                    break
                delta_b[j] -= q
                previous_j = j
        for i in range(1, n):
            delta_b[i] += delta_b[i - 1]
        return delta_b
    
    
    def compute_b_slow(a):
        n = len(a)
        b = [0] * n
        for i, ai in enumerate(a):
            for j in range(n - i):
                b[i + j] += ai // (j + 1)
        return b
    
    
    for n in range(1, 100):
        print(list(maximal_pairs(n)))
    
    lst = [1, 34, 3, 2, 9, 21, 3, 2, 2, 1]
    print(compute_b_fast(lst))
    print(compute_b_slow(lst))
    

提交回复
热议问题