In max contiguous subarray in Python, you are given a list of integers[positive and negative], and you have to find a sub-list from the given list which has the maximum sum and print the sum.
For example: list = [1, 6, -7, 5]
now, possible contiguous lists are:
[1]
[1, 6]
[1, 6, -7]
[1, 6, -7, 5]
[6]
[6, -7]
[6, -7, 5]
[-7]
[-7, 5]
[5]
Now, the list with the highest sum is the 2nd list having 7 as the total sum.
Now, let’s code the max sub-array problem.
myList = [-1, 2, 4, -7, 5, -9] listOfSubLists = [] for i in range[len[myList]+1]: for j in range[i+1, len[myList]+1]: listOfSubLists.append[myList[i:j]] listOfAllSum = [] for i in listOfSubLists: listOfAllSum.append[sum[i]] max = -1 index = 0 for i in range[len[listOfAllSum]]: if listOfAllSum[i]>max: max = listOfAllSum[i] index = i print['List with maximum sum is: ', listOfSubLists[index]] print['Maximum sum is: ', max]
Max Contiguous Subarray
Given a list of integers, write a program to identify the contiguous sub-list that has the largest sum and print the sum. Any non-empty slice of the list with step size 1 can be considered as a contiguous sub-list.Input
The input will contain space-separated integers, denoting the elements of the list.Output
The output should be an integer.Explanation
For example, if the given list is [2, -4, 5, -1, 2, -3], then all the possible contiguous sub-lists will be,
[2]
[2, -4]
[2, -4, 5]
[2, -4, 5, -1]
[2, -4, 5, -1, 2]
[2, -4, 5, -1, 2, -3]
[-4]
[-4, 5]
[-4, 5, -1]
[-4, 5, -1, 2]
[-4, 5, -1, 2, -3]
[5]
[5, -1]
[5, -1, 2]
[5, -1, 2, -3]
[-1]
[-1, 2]
[-1, 2, -3]
[2]
[2, -3]
[-3]
Among the above contiguous sub-lists, the contiguous sub-list [5, -1, 2] has the largest sum which is 6.
Sample Input 1
2 -4 5 -1 2 -3
Sample Output 1
6
Sample Input 2
-2 -3 4 -1 -2 1 5 -3
Sample Output 2
7
Max Contiguous Subarray
Given a list of integers, write a program to identify the contiguous sub-list that has the largest sum and print the sum. Any non-empty slice of the list with step size 1 can be considered as a contiguous sub-list.
Input
The input will contain space-separated integers, denoting the elements of the list.
Output
The output should be an integer.
Explanation
For example, if the given list is [2, -4, 5, -1, 2, -3], then all the possible contiguous sub-lists will be,
[2]
[2, -4]
[2, -4, 5]
[2, -4, 5, -1]
[2, -4, 5, -1, 2]
[-4]
[-4, 5]
[-4, 5, -1]
[-4, 5, -1, 2]
[5]
[5, -1]
[5, -1, 2]
[-1]
[-1, 2]
[2]
Among the above contiguous sub-lists, the contiguous sub-list [5, -1, 2] has the largest sum which is 6.
Sample Input 1
2 -4 5 -1 2 -3
Sample Output 1
6
Sample Input 2
-2 -3 4 -1 -2 1 5 -3
Sample Output 2
7
Write an efficient program to find the sum of contiguous subarray within a one-dimensional array of numbers that has the largest sum.
Kadane’s Algorithm:
Initialize: max_so_far = INT_MIN max_ending_here = 0 Loop for each element of the array [a] max_ending_here = max_ending_here + a[i] [b] if[max_so_far < max_ending_here] max_so_far = max_ending_here [c] if[max_ending_here < 0] max_ending_here = 0 return max_so_far
Explanation:
The simple idea of Kadane’s algorithm is to look for all positive contiguous segments of the array [max_ending_here is used for this]. And
keep track of maximum sum contiguous segment among all positive segments [max_so_far is used for this]. Each time we get a positive-sum compare it with max_so_far and update max_so_far if it is greater than max_so_far
Lets take the example: {-2, -3, 4, -1, -2, 1, 5, -3} max_so_far = max_ending_here = 0 for i=0, a[0] = -2 max_ending_here = max_ending_here + [-2] Set max_ending_here = 0 because max_ending_here < 0 for i=1, a[1] = -3 max_ending_here = max_ending_here + [-3] Set max_ending_here = 0 because max_ending_here < 0 for i=2, a[2] = 4 max_ending_here = max_ending_here + [4] max_ending_here = 4 max_so_far is updated to 4 because max_ending_here greater than max_so_far which was 0 till now for i=3, a[3] = -1 max_ending_here = max_ending_here + [-1] max_ending_here = 3 for i=4, a[4] = -2 max_ending_here = max_ending_here + [-2] max_ending_here = 1 for i=5, a[5] = 1 max_ending_here = max_ending_here + [1] max_ending_here = 2 for i=6, a[6] = 5 max_ending_here = max_ending_here + [5] max_ending_here = 7 max_so_far is updated to 7 because max_ending_here is greater than max_so_far for i=7, a[7] = -3 max_ending_here = max_ending_here + [-3] max_ending_here = 4
Program:
Python3
from
math
import
inf
maxint
=
inf
def
maxSubArraySum[a,size]:
max_so_far
=
-
maxint
-
1
max_ending_here
=
0
for
i
in
range
[
0
, size]:
max_ending_here
=
max_ending_here
+
a[i]
if
[max_so_far < max_ending_here]:
max_so_far
=
max_ending_here
if
max_ending_here <
0
:
max_ending_here
=
0
return
max_so_far
a
=
[
-
13
,
-
3
,
-
25
,
-
20
,
-
3
,
-
16
,
-
23
,
-
12
,
-
5
,
-
22
,
-
15
,
-
4
,
-
7
]
print
[
"Maximum contiguous sum is"
, maxSubArraySum[a,
len
[a]]]
Output:
Maximum contiguous sum is 7
Another approach:
Python3
def
maxSubArraySum[a,size]:
max_so_far
=
a[
0
]
max_ending_here
=
0
for
i
in
range
[
0
, size]:
max_ending_here
=
max_ending_here
+
a[i]
if
max_ending_here <
0
:
max_ending_here
=
0
elif
[max_so_far < max_ending_here]:
max_so_far
=
max_ending_here
return
max_so_far
Time Complexity: O[n]
Algorithmic Paradigm: Dynamic Programming
Following is another simple implementation suggested by Mohit Kumar. The implementation handles the case when all numbers in the array are negative.
Python3
def
maxSubArraySum[a,size]:
max_so_far
=
a[
0
]
curr_max
=
a[
0
]
for
i
in
range
[
1
,size]:
curr_max
=
max
[a[i], curr_max
+
a[i]]
max_so_far
=
max
[max_so_far,curr_max]
return
max_so_far
a
=
[
-
2
,
-
3
,
4
,
-
1
,
-
2
,
1
,
5
,
-
3
]
print
[
"Maximum contiguous sum is"
, maxSubArraySum[a,
len
[a]]]
Output:
Maximum contiguous sum is 7
To print the subarray with the maximum sum, we maintain indices whenever we get the maximum sum.
Python3
from
sys
import
maxsize
def
maxSubArraySum[a,size]:
max_so_far
=
-
maxsize
-
1
max_ending_here
=
0
start
=
0
end
=
0
s
=
0
for
i
in
range
[
0
,size]:
max_ending_here
+
=
a[i]
if
max_so_far < max_ending_here:
max_so_far
=
max_ending_here
start
=
s
end
=
i
if
max_ending_here <
0
:
max_ending_here
=
0
s
=
i
+
1
print
[
"Maximum contiguous sum is %d"
%
[max_so_far]]
print
[
"Starting Index %d"
%
[start]]
print
[
"Ending Index %d"
%
[end]]
a
=
[
-
2
,
-
3
,
4
,
-
1
,
-
2
,
1
,
5
,
-
3
]
maxSubArraySum[a,
len
[a]]
Output:
Maximum contiguous sum is 7 Starting index 2 Ending index 6
Kadane’s Algorithm can be viewed both as a greedy and DP. As we can see that we are keeping a running sum of integers and when it becomes less than 0, we reset it to 0 [Greedy Part]. This is because continuing with a negative sum is way more worse than restarting with a new range. Now it can also be viewed as a DP, at each stage we have 2 choices: Either take the current element and continue with previous sum OR restart a new range. These both choices are being taken care of in the implementation.
Time Complexity: O[n]
Auxiliary Space: O[1]
Now try the below question
Given an array of integers [possibly some
elements negative], write a C program to find out the *maximum product* possible by multiplying ‘n’ consecutive integers in the array where n ≤ ARRAY_SIZE. Also, print the starting point of the maximum product subarray.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.