1
1
"""
2
2
author : Mayank Kumar Jha (mk9440)
3
+ author(after editing) : Snehanjali G V S
3
4
"""
4
5
from __future__ import annotations
5
6
6
7
7
- def find_max_sub_array (a , low , high ):
8
- if low == high :
9
- return low , high , a [low ]
10
- else :
11
- mid = (low + high ) // 2
12
- left_low , left_high , left_sum = find_max_sub_array (a , low , mid )
13
- right_low , right_high , right_sum = find_max_sub_array (a , mid + 1 , high )
14
- cross_left , cross_right , cross_sum = find_max_cross_sum (a , low , mid , high )
15
- if left_sum >= right_sum and left_sum >= cross_sum :
16
- return left_low , left_high , left_sum
17
- elif right_sum >= left_sum and right_sum >= cross_sum :
18
- return right_low , right_high , right_sum
19
- else :
20
- return cross_left , cross_right , cross_sum
21
-
22
-
23
- def find_max_cross_sum (a , low , mid , high ):
24
- left_sum , max_left = - 999999999 , - 1
25
- right_sum , max_right = - 999999999 , - 1
26
- summ = 0
27
- for i in range (mid , low - 1 , - 1 ):
28
- summ += a [i ]
29
- if summ > left_sum :
30
- left_sum = summ
31
- max_left = i
32
- summ = 0
33
- for i in range (mid + 1 , high + 1 ):
34
- summ += a [i ]
35
- if summ > right_sum :
36
- right_sum = summ
37
- max_right = i
38
- return max_left , max_right , (left_sum + right_sum )
39
-
40
-
41
- def max_sub_array (nums : list [int ]) -> int :
8
+ def max_sub_array (a : list [int ]) -> int :
42
9
"""
43
10
Finds the contiguous subarray which has the largest sum and return its sum.
44
11
@@ -58,36 +25,20 @@ def max_sub_array(nums: list[int]) -> int:
58
25
>>> max_sub_array([31, -41, 59, 26, -53, 58, 97, -93, -23, 84])
59
26
187
60
27
"""
61
- best = 0
62
- current = 0
63
- for i in nums :
64
- current += i
65
- current = max (current , 0 )
66
- best = max (best , current )
67
- return best
28
+ sol = [0 ]* (len (a ) + 1 )
29
+ for i in range (1 , len (sol )):
30
+ sol [i ] = max (sol [i - 1 ] + a [i - 1 ], a [i - 1 ])
31
+
32
+ answer = sol [0 ]
33
+ for i in range (1 , len (sol )):
34
+ if answer < sol [i ]:
35
+ answer = sol [i ]
36
+ return answer
68
37
69
38
70
39
if __name__ == "__main__" :
71
40
"""
72
41
A random simulation of this algorithm.
73
42
"""
74
- import time
75
- from random import randint
76
-
77
- from matplotlib import pyplot as plt
78
-
79
- inputs = [10 , 100 , 1000 , 10000 , 50000 , 100000 , 200000 , 300000 , 400000 , 500000 ]
80
- tim = []
81
- for i in inputs :
82
- li = [randint (1 , i ) for j in range (i )]
83
- strt = time .time ()
84
- (find_max_sub_array (li , 0 , len (li ) - 1 ))
85
- end = time .time ()
86
- tim .append (end - strt )
87
- print ("No of Inputs Time Taken" )
88
- for i in range (len (inputs )):
89
- print (inputs [i ], "\t \t " , tim [i ])
90
- plt .plot (inputs , tim )
91
- plt .xlabel ("Number of Inputs" )
92
- plt .ylabel ("Time taken in seconds " )
93
- plt .show ()
43
+ inputs = [- 2 , 1 , - 3 , 4 , - 1 , 2 , 1 , - 5 , 4 ]
44
+ print (max_sub_array (inputs ))
0 commit comments