This algorithm can be used to calculate the maximum sum subarray with indices in any given array (length n) of integers in O(n) Time and O(1) space.
package algos;
class solution {
public solution() {}
public int getMaxSum(int[] arr) {
int max = arr[0], start = 0, end = 0, mstart = 0, mend = 0, currmax = arr[0];
for (int i = 1; i < arr.length; i++) {
if (arr[i] > arr[i] + currmax) {
currmax = arr[i];
start = i;
} else {
currmax = currmax + arr[i];
}
end = i;
if (currmax > max) {
max = currmax;
mstart = start;
mend = end;
}
}
System.out.println("start:" + mstart + " end:" + mend);
return max;
}
}
public class kadanes {
public static void main(String[] args) {
int[] arr = {-1, -4, -2};
solution sol = new solution();
System.out.println(sol.getMaxSum(arr));
}
}
Output
start:0 end:0 -1
This algorithm can be used to find out the maximum sum rectangular sub-matrix in an mxn matrix in O(n*n*m) time and O(m) space.
Javasript (ES6) Solution
const getMaxSum = (arr) => {
if (!arr)
return;
let currMax = arr[0];
let max = currMax;
let currStart = 0;
let currEnd = arr.length;
let maxStart = currStart;
let maxEnd = currEnd;
for (let i = 1; i < arr.length; i++) {
if (arr[i] > arr[i] + currMax) {
currStart = i;
currMax = arr[i];
} else {
currMax += arr[i];
}
currEnd = i;
if (currMax > max) {
max = currMax;
maxStart = currStart;
maxEnd = currEnd;
}
}
console.log(`start: ${maxStart}`);
console.log(`end: ${maxEnd}`);
console.log(`max: ${max}`);
};
getMaxSum([1, 2, -9, 9, 67, -1]);
// output
/*
"start: 3"
"end: 4"
"max: 76"
*/