// C program for the above approach
#include <stdio.h>
int kadaneMinSubArr(int* nums, int l, int r);
int kadaneMaxSubArr(int* nums, int l, int r);
// Find maximum between two numbers.
int max(int num1, int num2)
{
return (num1 > num2) ? num1 : num2;
}
// Find minimum between two numbers.
int min(int num1, int num2)
{
return (num1 > num2) ? num2 : num1;
}
void maxSubArrSum(int* nums, int n)
{
// !T(N) = O(n)
// !S(N) = O(1)
// finding the left most positive elements and right
// most positive elements indexes
int l = -1, r = -1, sum = 0, minSubSum;
// left most positive element
for (int i = 0; i < n; i++) {
if (nums[i] >= 0) {
l = i;
break;
}
}
// right most positive element
for (int i = n - 1; i >= 0; i--) {
if (nums[i] >= 0) {
r = i;
break;
}
}
if (l == -1 && r == -1) {
// all are -ve numbers
// maximum sum of subarray
printf("%d", kadaneMaxSubArr(nums, 0, n - 1));
return;
}
// finding sum
for (int i = l; i <= r; i++)
sum += nums[i];
// minimum sum of subarray
minSubSum = kadaneMinSubArr(nums, l, r);
(minSubSum < 0) ? printf("%d", sum - minSubSum)
: printf("%d", sum);
}
int kadaneMaxSubArr(int* nums, int l, int r)
{
// l : left-bound index
// r : right-bound index
// !T(N) = O(N)
// !S(N) = O(1)
// finding the maxSubArrSum
int sum = nums[l], maxSum = nums[l];
for (int i = l; i <= r; i++) {
sum = max(sum + nums[i], nums[i]);
maxSum = max(maxSum, sum);
}
return maxSum;
}
int kadaneMinSubArr(int* nums, int l, int r)
{
// !T(N) = O(N)
// !S(N) = O(1)
// finding the minSubArrSum
int sum = nums[l], minSum = nums[l];
for (int i = l; i <= r; i++) {
sum = min(sum + nums[i], nums[i]);
minSum = min(minSum, sum);
}
return minSum;
}
// Driver Code
int main()
{
int arr[] = { 7, 6, -1, -4, -5, 7, 1 };
int n = sizeof(arr) / sizeof(arr[0]);
maxSubArrSum(arr, n);
return 0;
}
// This code is contributed by Sania Kumari Gupta