Given a single dimensional array, find the maximum value, a contiguous subarray can have.
Kadane’s Algorithm for finding the maximum subarray for an one dimensional array in O(n) time.
Note: This algorithm requires at least one positive number, so all negative array is invalid input.
begin
(maxSum, maxStart, maxEnd) := (-INF, 0, 0)
currMaxSum := 0
currStart := 1
for currEnd := 1 to n do
currMaxSum := currMaxSum + array[currEnd]
if currMaxSum > maxSum then
(maxSum, maxStart, maxEnd) := (currMaxSum, currStart, currEnd)
endif
if currMaxSum < 0 then
currMaxSum := 0
currStart := currEnd + 1
endif
endfor
return (maxSum, maxStart, maxEnd)
end
Solution: Find max sum
#include <bits/stdc++.h> using namespace std; int solve(vector<int>& vec) { int current_sum = vec[0]; int global_sum = vec[0]; for (int i = 1; i < vec.size(); i++) { current_sum = max(vec[i], current_sum + vec[i]); global_sum = max(current_sum, global_sum); } return global_sum; } int main() { vector<int> vec = {-2, -3, 14, -1, 2, 1, 5, -3}; cout << solve(vec) << endl; }
21
Solution: Find max sum along with start and end index
#include <bits/stdc++.h> using namespace std; vector<int> solve(vector<int> &vec) { int current_sum = 0; int global_sum = INT_MIN; int max_start = 0; int max_end = 0; int curr_start = 0; for (int i = 0; i < vec.size(); i++) { current_sum += vec[i]; if (global_sum < current_sum) { global_sum = current_sum; max_start = curr_start; max_end = i; } if (current_sum < 0) { current_sum = 0; curr_start = i + 1; } } vector<int> result; result.push_back(global_sum); result.push_back(max_start); result.push_back(max_end); return result; } int main() { vector<int> vec = {-2, -3, 14, -1, 2, 1, 5, -3}; vector<int> res = solve(vec); cout << "Max sum: " << res[0] << endl; cout << "Start index: " << res[1] << endl; cout << "End index: " << res[2] << endl; }
Max sum: 21 Start index: 2 End index: 6
References