在给定范围内的所有元素相乘后,找到给定范围内的所有可能子列表和最小乘积的高效且Python方式?

sr1*_*sr1 4 python reduce list python-2.7 python-3.x

我已经完成了这两件事。

  1. 在给定范围内找到列表的所有可能的子列表(i ,j)

    A = [ 44, 55, 66, 77, 88, 99, 11, 22, 33 ] 
    Let, i = 2 and j = 4
    
    Run Code Online (Sandbox Code Playgroud)

    然后,"A"给定范围内列表的可能子列表(2,4)为:

    [66], [66,77], [66,77,88], [77], [77,88], [88]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 并且,将子

    列表的所有元素相乘后的结果乘积的最小值:因此,将上述子列表中的所有元素相乘后的结果列表将变为

    X = [66, 5082, 447216, 77, 6776, 88]`    
    
    Run Code Online (Sandbox Code Playgroud)

    现在,以上列表的最小值,min(X)66

我的代码

i, j = 2, 4
A = [ 44, 55, 66, 77, 88, 99, 11, 22, 33 ] 
O, P = i, i
mini = A[O]
while O <= j and P <= j:
    if O == P:
        mini = min(mini, reduce(lambda x, y: x * y, [A[O]]))
    else:
        mini = min(mini, reduce(lambda x, y: x * y, A[O:P + 1]))
    P += 1
    if P > j:
        O += 1
        P = O
print(mini)
Run Code Online (Sandbox Code Playgroud)

我的问题:

对于较大的列表和较大的范围,此代码花费更多的时间来执行!
有没有可能减少上述代码时间复杂度的“ Pythonic”方式?

提前致谢 !

编辑:

得到它了。但是,如果有多个相同的最小产品可能的子列表,

  1. 我需要最长的子列表范围 (i,j)
  2. 如果仍然有多个子列表具有相同的“最长子范围”,则需要打印起始索引最低的子间隔。


A = [2, 22, 10, 12, 2]如果 考虑此列表(i,j) = (0,4)
有领带。Min product = 2有两种可能性'(0,0)' and '(4,4)'
两个子列表范围= 0 [ (0-0) and (4-4) ]
在这种情况下,我需要print (minproduct, [sublist-range])= 2, [0,0]

使用字典尝试过,它适用于某些输入,但不适用于所有输入!如何做到这一点?
谢谢 !

Yu *_*Hao 5

首先,给定列表和索引范围,我们可以获得子列表 A[i : j + 1]

[66, 77, 88]
Run Code Online (Sandbox Code Playgroud)

对于正整数aba * b不得小于ab。因此,您不需要进行乘法运算,两个或多个元素的乘法运算结果不可能较小。这个列表的最小所有的相乘结果的最小值。

所以结果是:

min(A[i : j + 1])
Run Code Online (Sandbox Code Playgroud)