Maximum prefix sum which is equal to suffix sum such that prefix and suffix do not overlap
Last Updated :
30 Nov, 2022
Given an array arr[] of N Positive integers, the task is to find the largest prefix sum which is also the suffix sum and prefix and suffix do not overlap.
Examples:
Input: N = 5, arr = [1, 3, 2, 1, 4]
Output: 4
Explanation: consider prefix [1, 3] and suffix [4] which gives maximum
prefix sum which is also suffix sum such that prefix and suffix do not overlap.
Input: N = 5, arr = [1, 3, 1, 1, 4]
Output: 5
Approach: The problem can be solved using the two-pointer technique.
Use two pointers from both ends of array and keep maintaining sum of prefix and suffix, keep moving pointers till they overlap.
Follow the steps to solve the problem:
- Declare and initialize two variables i = 0 and j = N – 1.
- Declare and initialize two variables to store prefix and suffix sum, prefix = 0, suffix = 0.
- Declare and initialize a variable result to keep the maximum possible prefix sum, result = 0.
- while i is less than or equal to
- If prefix sum is less than suffix sum add array element at the ith index to prefix sum and increment value of i.
- Else add array element at the jth index to suffix sum and decrement value of j.
- If both of them are equal update the result variable with prefix sum.
- Print value of the result.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
int maxPrefixSum( int N, int * arr)
{
int i = 0, j = N - 1;
int prefixSum = 0, suffixSum = 0;
int result = 0;
while (i <= j) {
if (prefixSum < suffixSum) {
prefixSum += arr[i];
i++;
}
else {
suffixSum += arr[j];
j--;
}
if (prefixSum == suffixSum)
result = prefixSum;
}
return result;
}
int main()
{
int arr[] = { 1, 3, 1, 1, 4 };
int N = sizeof (arr) / sizeof (arr[0]);
cout << maxPrefixSum(N, arr);
return 0;
}
|
Java
import java.io.*;
class GFG {
public static int maxPrefixSum( int N, int arr[])
{
int i = 0 , j = N - 1 ;
int prefixSum = 0 , suffixSum = 0 ;
int result = 0 ;
while (i <= j) {
if (prefixSum < suffixSum) {
prefixSum += arr[i];
i++;
}
else {
suffixSum += arr[j];
j--;
}
if (prefixSum == suffixSum)
result = prefixSum;
}
return result;
}
public static void main(String[] args)
{
int arr[] = { 1 , 3 , 1 , 1 , 4 };
int N = arr.length;
System.out.print(maxPrefixSum(N, arr));
}
}
|
Python3
import math
def maxPrefixSum(N, arr):
i = 0
j = N - 1 ;
prefixSum = 0
suffixSum = 0 ;
result = 0 ;
while i < = j:
if (prefixSum < suffixSum):
prefixSum + = arr[i];
i = i + 1 ;
else :
suffixSum + = arr[j];
j = j - 1 ;
if (prefixSum = = suffixSum):
result = prefixSum;
return result;
arr = [ 1 , 3 , 1 , 1 , 4 ];
N = len (arr);
print (maxPrefixSum(N, arr));
|
C#
using System;
public class GFG{
public static int maxPrefixSum( int N, int [] arr)
{
int i = 0, j = N - 1;
int prefixSum = 0, suffixSum = 0;
int result = 0;
while (i <= j) {
if (prefixSum < suffixSum) {
prefixSum += arr[i];
i++;
}
else {
suffixSum += arr[j];
j--;
}
if (prefixSum == suffixSum)
result = prefixSum;
}
return result;
}
static public void Main (){
int [] arr = { 1, 3, 1, 1, 4 };
int N = arr.Length;
Console.Write(maxPrefixSum(N, arr));
}
}
|
Javascript
<script>
function maxPrefixSum(N, arr)
{
let i = 0, j = N - 1;
let prefixSum = 0, suffixSum = 0;
let result = 0;
while (i <= j) {
if (prefixSum < suffixSum) {
prefixSum += arr[i];
i++;
}
else {
suffixSum += arr[j];
j--;
}
if (prefixSum == suffixSum)
result = prefixSum;
}
return result;
}
let arr = [1, 3, 1, 1, 4];
let N = arr.length;
document.write(maxPrefixSum(N, arr));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Share your thoughts in the comments
Please Login to comment...