xxxxxxxxxx
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
xxxxxxxxxx
let array = [-3, 1, -8, 12, 0, -3, 5, -9, 4]
// We are using sliding window technique
// Time complexity: O(n), Space: O(1)
function maxSubArray(array) {
let current_sum = array[0]
let max_sum = array[0]
for (let i = 1; i < array.length; i++) {
current_sum = Math.max(array[i], current_sum + array[i])
if (current_sum > max_sum) {
max_sum = current_sum
}
}
return max_sum
}
console.log(maxSubArray(array)) // [Log]: 14
xxxxxxxxxx
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[]={2, -4, 3, -1, 2};
int local_max = 0;
int global_max = INT_MIN;
int n=sizeof(a)/sizeof(a[0]);
for(i = 0; i < n;i++)
{
local_max = max(a[i], a[i] + local_max);
if(local_max > global_max)
{
global_max = local_max;
}
}
cout<<global_max;
return 0;
}
xxxxxxxxxx
public int kadane(int[] arr){
int max_so_far = 0, curr_max = Integer.MIN_VALUE;
for(int i: arr){
max_so_far += i;
if(max_so_far<0) max_so_far = 0;
if(max_so_far>curr_max) curr_max = max_so_far;
}
return curr_max;
}
xxxxxxxxxx
class Solution {
public:
int maxProduct(vector<int>& nums) {
// Return early if input is empty
if (nums.empty()) return 0;
int best = INT_MIN;
// Running products
int maxProd = 1;
int minProd = 1;
for (int n: nums) {
if (n < 0) {
// Swap max and min
swap(maxProd, minProd);
}
// Reset to current value if smaller or larger than it
// (intuitively means that we start considering a new sub-array)
maxProd = max(maxProd*n, n);
minProd = min(minProd*n, n);
// Update the best
best = max(best, maxProd);
}
return best;
}
};
xxxxxxxxxx
#include <bits/stdc++.h>
using namespace std;
int max_sumarray(int arr[],int n)//calculate the max sum; it has two parts
{
int max_sum;
int cur_sum;
int count=0;
for(int i=0;i<n;i++)
{
if(arr[i]<0)
{
count++;
}
}
if(count!=n)//part 1 when elements are all +ve or +ve and -ve
{
max_sum=0;
cur_sum=0;
for(int i=0;i<n;i++)
{
cur_sum=cur_sum+arr[i];
if(cur_sum>max_sum)
{
max_sum=cur_sum;
}
if(cur_sum<0)
{
cur_sum=0;
}
}
}
else if(count==n)//part 2 when all the elements are -ve
{
max_sum=arr[0];
cur_sum=arr[0];
for(int i=1;i<n;i++)
{
cur_sum=max(arr[i],cur_sum+arr[i]);
max_sum=max(cur_sum,max_sum);
}
}
return max_sum;
}
int main()
{
int n;
cout<<"enter the size of the array:"<<endl;
cin>>n;
int arr[n];
cout<<"enter the elements of the array:"<<endl;
for(int i=0;i<n;i++)
{
cin>>arr[i];
}
int max_subarray_sum=max_sumarray(arr,n);
cout<<max_subarray_sum<<endl;
}
xxxxxxxxxx
public class Kadanes_Algorithm {
public static void kadane(int[] Array) {
int Max_Sum = Integer.MIN_VALUE;
int Current_Sum = 0;
for (int i = 0; i < Array.length; i++) {
Current_Sum += Array[i];
if (Current_Sum < 0) {
Current_Sum = 0;
}
Max_Sum = Math.max(Max_Sum, Current_Sum);
}
System.out.println("Max Sum : " + Max_Sum);
}
public static void main(String[] args) {
int[] arr = {-1, -2, 6, -1, 3};
kadane(arr);
}
}
xxxxxxxxxx
// C++ program to print largest contiguous array sum
#include<iostream>
#include<climits>
using namespace std;
int maxSubArraySum(int a[], int size)
{
int max_so_far = INT_MIN, max_ending_here = 0;
for (int i = 0; i < size; i++)
{
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;
}
/*Driver program to test maxSubArraySum*/
int main()
{
int a[] = {-2, -3, 4, -1, -2, 1, 5, -3};
int n = sizeof(a)/sizeof(a[0]);
int max_sum = maxSubArraySum(a, n);
cout << "Maximum contiguous sum is " << max_sum;
return 0;
}
xxxxxxxxxx
class KadaneAlgo1
{
//Function to print the maximum contiguous subarray sum ending at each
//position in the array and return the overall maximum.
public long maximumSum(int arr[], int sizeOfArray)
{
int res=arr[0];
int currmax=arr[0];
StringBuffer sb=new StringBuffer();
sb.append(arr[0]+" ");
for(int i=1;i<sizeOfArray;i++){
currmax=Math.max(currmax+arr[i],arr[i]);
res=Math.max(res,currmax);
sb.append(currmax+" ");
}
System.out.println(sb.toString().trim());
return res;
}
}
xxxxxxxxxx
class KadanesAlgorithm2
{
//Function to return the maximum sum without adding adjacent elements.
public long maximumSum(int arr[], int sizeOfArray)
{
if(sizeOfArray==1)
return arr[0];
if(sizeOfArray==2)
return Math.max(arr[0],arr[1]);
long[] dp=new long[sizeOfArray+1];
dp[1]=arr[0];
dp[2]=Math.max(arr[0],arr[1]);
for(int i=3;i<=sizeOfArray;i++){
dp[i]=Math.max(arr[i-1],Math.max(arr[i-1]+dp[i-2],dp[i-1]));
}
return dp[sizeOfArray];
}
}