Maximum Subarray Sum of Alternate Parity
Last Updated :
18 Jan, 2024
Given array A[] of size N. The Task for this problem is to find the maximum subarray (Subarrays are arrays within another array. Subarrays contain contiguous elements) sum such that adjacent elements of the subarray should have different parity.
Examples:
Input: A[] = {-1, 4, -1, 0, 5, -4}
Output: 8
Explanation: Subarray {4, -1, 0, 5} has maximum sum with consecutive elements has alternate parity (4 is even, -1 is odd, 0 is even, 5 is odd)
Input: A[] = {-1, 2, 4, -3}
Output: 4
Explanation: Subarray {4} has maximum sum.
Approach: To solve the problem efficiently follow the below idea:
Kadane’s Algorithm can be used to solve this problem, small change is that whenever our parity is not same we start new subarray with that point. Using this we can calculate maximum subarray sum with alternate parity with required subarray.
Below are the steps for the above approach:
- Initialize the variable curSum = A[0]
- Initialize the maximumSum = 0 that keeps track of the maximum subarray sum with alternate parity.
- Iterate over N elements
- If the parity is the same then update curSum with A[i]
- else if the current sum is negative then update curSum with A[i]
- else add A[i] in curSum
- in each iteration update maximumSum with curSum.
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findMaxSubarraySum( int A[], int N)
{
int curSum = A[0];
int maximumSum = 0;
for ( int i = 1; i < N; i++) {
if (A[i] % 2 != A[i - 1] % 2) {
if (curSum + A[i] > A[i]) {
curSum += A[i];
}
else {
curSum = A[i];
}
}
else {
curSum = A[i];
}
maximumSum = max(maximumSum, curSum);
}
return maximumSum;
}
int32_t main()
{
int N = 6;
int A[] = { -1, 4, -1, 0, 5, -4 };
cout << findMaxSubarraySum(A, N) << endl;
int N1 = 4;
int A1[] = { -1, 2, 4, -3 };
cout << findMaxSubarraySum(A1, N1) << endl;
return 0;
}
|
Java
public class Main {
static int findMaxSubarraySum( int [] A, int N) {
int curSum = A[ 0 ];
int maximumSum = 0 ;
for ( int i = 1 ; i < N; i++) {
if (A[i] % 2 != A[i - 1 ] % 2 ) {
if (curSum + A[i] > A[i]) {
curSum += A[i];
} else {
curSum = A[i];
}
} else {
curSum = A[i];
}
maximumSum = Math.max(maximumSum, curSum);
}
return maximumSum;
}
public static void main(String[] args) {
int N = 6 ;
int [] A = { - 1 , 4 , - 1 , 0 , 5 , - 4 };
System.out.println(findMaxSubarraySum(A, N));
int N1 = 4 ;
int [] A1 = { - 1 , 2 , 4 , - 3 };
System.out.println(findMaxSubarraySum(A1, N1));
}
}
|
Python3
def find_max_subarray_sum(arr, N):
cur_sum = arr[ 0 ]
maximum_sum = 0
for i in range ( 1 , N):
if arr[i] % 2 ! = arr[i - 1 ] % 2 :
if cur_sum + arr[i] > arr[i]:
cur_sum + = arr[i]
else :
cur_sum = arr[i]
else :
cur_sum = arr[i]
maximum_sum = max (maximum_sum, cur_sum)
return maximum_sum
if __name__ = = "__main__" :
N = 6
A = [ - 1 , 4 , - 1 , 0 , 5 , - 4 ]
print (find_max_subarray_sum(A, N))
N1 = 4
A1 = [ - 1 , 2 , 4 , - 3 ]
print (find_max_subarray_sum(A1, N1))
|
C#
using System;
class GFG
{
static int FindMaxSubarraySum( int [] A, int N)
{
int curSum = A[0];
int maximumSum = 0;
for ( int i = 1; i < N; i++)
{
if (A[i] % 2 != A[i - 1] % 2)
{
if (curSum + A[i] > A[i])
{
curSum += A[i];
}
else
{
curSum = A[i];
}
}
else
{
curSum = A[i];
}
maximumSum = Math.Max(maximumSum, curSum);
}
return maximumSum;
}
static void Main( string [] args)
{
int N = 6;
int [] A = { -1, 4, -1, 0, 5, -4 };
Console.WriteLine(FindMaxSubarraySum(A, N));
int N1 = 4;
int [] A1 = { -1, 2, 4, -3 };
Console.WriteLine(FindMaxSubarraySum(A1, N1));
}
}
|
Javascript
function findMaxSubarraySum(A, N) {
let curSum = A[0];
let maximumSum = 0;
for (let i = 1; i < N; i++) {
if (A[i] % 2 !== A[i - 1] % 2) {
if (curSum + A[i] > A[i]) {
curSum += A[i];
} else {
curSum = A[i];
}
} else {
curSum = A[i];
}
maximumSum = Math.max(maximumSum, curSum);
}
return maximumSum;
}
const N = 6;
const A = [-1, 4, -1, 0, 5, -4];
console.log(findMaxSubarraySum(A, N));
const N1 = 4;
const A1 = [-1, 2, 4, -3];
console.log(findMaxSubarraySum(A1, N1));
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...