-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmaximum_subarray_sum.py
More file actions
52 lines (34 loc) · 1.13 KB
/
maximum_subarray_sum.py
File metadata and controls
52 lines (34 loc) · 1.13 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
"""
Given an array, the task is to find the subarray
that has the maximum sum and return its sum.
Examples:
Input: array = {2, 3, -8, 7, -1, 2, 3}
Output: 11
Explanation: The subarray {7, -1, 2, 3} has the largest sum 11.
Input: array = {-2, -4}
Output: -2
Explanation: The subarray {-2} has the largest sum -2.
Input: array = {5, 4, 1, 7, 8}
Output: 25
Explanation: The subarray {5, 4, 1, 7, 8} has the largest sum 25.
"""
from typing import Callable
def subarray_sum(array: list[int], predicate: Callable = max) -> int:
max_sum = max_end = array[0]
for item in array[1:]:
max_end = predicate(item, max_end + item)
max_sum = predicate(max_sum, max_end)
return max_sum
def circular_subarray_sum(array: list[int]) -> int:
max_sum = subarray_sum(array, predicate=max)
if max_sum < 0:
return max_sum
max_wrap = sum(array) - subarray_sum(array, predicate=min)
return max(max_sum, max_wrap)
if __name__ == "__main__":
given = [2, 3, -8, 7, -1, 2, 3]
print(subarray_sum(given))
given = [-2, -4]
print(subarray_sum(given))
given = [5, 4, 1, 7, 8]
print(subarray_sum(given))