python maxTransform减少时间复杂度

时间:2017-12-15 05:02:16

标签: python loops time-complexity dynamic-programming

我有这个函数maxTransform。

提供给我的Psudo代码

设A是零索引的整数数组。对于0< = i< = j<长度(A),让Ai..j表示从索引i到索引j的A的子数组,包括在内。

将A的最大变换定义为通过以下过程获得的数组:

设B为列表,最初为空。

  • 对于从0到长度(A)-1的k:
    • 对于i从0到长度(A)-k-1:
      • 让j = i + k
      • 将最大值(Ai..j)附加到B的末尾。
  • 返回B

返回的数组定义为A的最大变换。我们用S(A)表示它。 我们需要找到S的总和(S(A))。如果总和非常大,找到模10 ^ 9 + 7

正确的代码如下所示。

#!/bin/python
import sys

def solve(A):
    #  Return the sum of S(S(A)) modulo 10^9+7.
    sa = maxTransform(A)
    #debug
    print ('sa = {} '.format(sa))
    #debug -ends
    ssa = maxTransform(sa)
    #debug
    print ('ssa = {} '.format(ssa))
    #debug -ends
    return sum(ssa)%(10**9+7)

def maxTransform(a):
    b=[]
    lenA = len(a)
    for k in range(0, len(a)):
        for i in range(0, len(a)-k):
            j=i+k
            #debug
            print ('k = {}, i={}, j = {}, a = {} '.format(k, i, j, max(a[i:j+1])))
            #debug -ends
            b.append(max(a[i:j+1]))
        #for i -ends
    #for k -ends
    return b

if __name__ == "__main__":
    n = int(raw_input().strip())
    a = map(int, raw_input().strip().split(' '))
    result = solve(a)

    print result
  • 现在它的时间复杂度为O(n ^ 2)。我希望减少它。
  • 输入格式:

    • 第一行输入包含一个表示A长度的整数n。 - 第二行包含n个以空格分隔的整数A0,A1 ..,An-1表示A的元素。
    • 示例:输入:

      3 3 2 1

    • 输出:58
    • 说明:
      • 我们有

    A = [3,2,1] S(A) = [3,2,1,3,2,3] S(S(A) = [3,2,1,3,2,3,3,2,3,3,3,3,3,3,3,3,3,3,3,3,3]

    • 输入约束:
    • 1·; = N< = 2 * 10 ^ 5
    • 1·=艾&LT = 10 ^ 6

0 个答案:

没有答案