2017-07-03 48 views
0

作业:返回列表中k个连续元素的最大总和。我已经尝试了以下3种方法,这些方法在验证解决方案的7个测试中有6个适用。第七个测试是一个非常长的输入,具有非常大的k值。我不能放入输入列表,因为显示的列表由于其长度而被截断。这是我尝试的3种方法。重申,每次超时,而最后一个也给了我一个SyntaxError。 方法1:[详细]Python。作业:由于输入效率较高而不工作

def arrayMaxConsecutiveSum(inputArray, k): 
    sum_array = [] 
    for i in range(len(inputArray)-(k+1)): 
     sum_array.append(sum(inputArray[i:i+k])) 

    return max(sum_array) 

方法2:[一行=效率??]

def arrayMaxConsecutiveSum(inputArray, k): 

    return max([sum(inputArray[i:i+k]) for i in range(len(inputArray)-(k+1))]) 

方法3:LAMBDA呼叫

def arrayMaxConsecutiveSum(inputArray, k): 
    f = lambda data, n: [data[i:i+n] for i in range(len(data) - n + 1)] 

    sum_array = [sum(val) for val in f(inputArray,k)] 

    return max(sum_array) 

一些输入和实例(正确)输出:

  • IN:[2,3,5, 1,6] K:2 OUT:8
  • IN:[2,4,10,1] K:2 OUT:14
  • IN:[1,3,4,2,4,2, 4] K:4 OUT:13

同样,我想提一下,我通过其他试验(6很长的大的k值以及[K值是幅度小于一个数量级7的,然而]),只需要确定一种更有效的方法或修订版本,以提高效率。最后,我想补充一点,我试图既6和7与IDLE3的(截短的)输入和每个生成的ValueError

Traceback (most recent call last): 
    File "/Users/ryanflynn/arrmaxconsecsum.py", line 15, in <module> 
    962, 244, 390, 854, 406, 457, 160, 612, 693, 896, 800, 670, 776, 65, 81, 336, 305, 262, 877, 217, 50, 835, 307, 865, 774, 163, 556, 186, 734, 404, 610, 621, 538, 370, 153, 105, 816, 172, 149, 404, 634, 105, 74, 303, 304, 145, 592, 472, 778, 301, 480, 693, 954, 628, 355, 400, 327, 916, 458, 599, 157, 424, 957, 340, 51, 60, 688, 325, 456, 148, 189, 365, 358, 618, 462, 125, 863, 530, 942, 978, 898, 858, 671, 527, 877, 614, 826, 163, 380, 442, 68, 825, 978, 965, 562, 724, 553, 18, 554, 516, 694, 802, 650, 434, 520, 685, 581, 445, 441, 711, 757, 167, 594, 686, 993, 543, 694, 950, 812, 765, 483, 474, 961, 566, 224, 879, 403, 649, 27, 205, 841, 35, 35, 816, 723, 276, 984, 869, 502, 248, 695, 273, 689, 885, 157, 246, 684, 642, 172, 313, 683, 968, 29, 52, 915, 800, 608, 974, 266, 5, 252, 6, 15, 725, 788, 137, 200, 107, 173, 245, 753, 594, 47, 795, 477, 37, 904, 4, 781, 804, 352, 460, 244, 119, 410, 333, 187, 231, 48, 560, 771, 921, 595, 794, 925, 35, 312, 561, 173, 233, 669, 300, 73, 977, 977, 591, 322, 187, 199, 817, 386, 806, 625, 500, 1, 294, 40, 271, 306, 724, 713, 600, 126, 263, 591, 855, 976, 515, 850, 219, 118, 921, 522, 587, 498, 420, 724, 716],6886) 
    File "/Users/ryanflynn/arrmaxconsecsum.py", line 6, in arrayMaxConsecutiveSum 
    return max(sum_array) 
ValueError: max() arg is an empty sequence 

(注:此使用的方法3)I与打印语句检查两个值f(inputArray,k)sum_array[]任何帮助,将不胜感激:)

+0

这个列表到底有多长?第6次测试中'k'的值是多少? – Will

+0

@wilusdaman k:6886测试6 –

回答

2

尝试:

def arrayMaxConsecutiveSum(inputArray, k): 
    S = sum(inputArray[:k]) 
    M = S 
    for i in range(len(inputArray) - k): 
     S += (inputArray[i+k] - inputArray[i]) 
     if M < S: 
      M = S 
    return M 

S代表之和M代表最大。

这个解决方案有一个为O(n)的复杂性,当你的有O(N * K)

您正在总结k个正k次,当我总结3号n次。

+0

有趣的是,这适用于测试7,但不适用测试4:inputArray:[3,2,1,1] k:1.正确的答案是3,但是这产生了2。你详细说明5-7行是做什么的? –

+0

应该有M = S而不是M = 0。回答已被编辑。 – WPedrak

+0

第5行将索引i到i + k的总和从索引i + 1改变为i + k + 1,第6行和第7行只是检查这个id是否为新的最大值 – WPedrak