Skip to content

Commit 9f1b577

Browse files
Update max_sub_array.py
TheAlgorithms#8609
1 parent d182f95 commit 9f1b577

File tree

1 file changed

+13
-62
lines changed

1 file changed

+13
-62
lines changed

Diff for: dynamic_programming/max_sub_array.py

+13-62
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,11 @@
11
"""
22
author : Mayank Kumar Jha (mk9440)
3+
author(after editing) : Snehanjali G V S
34
"""
45
from __future__ import annotations
56

67

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:
429
"""
4310
Finds the contiguous subarray which has the largest sum and return its sum.
4411
@@ -58,36 +25,20 @@ def max_sub_array(nums: list[int]) -> int:
5825
>>> max_sub_array([31, -41, 59, 26, -53, 58, 97, -93, -23, 84])
5926
187
6027
"""
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
6837

6938

7039
if __name__ == "__main__":
7140
"""
7241
A random simulation of this algorithm.
7342
"""
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

Comments
 (0)