Given an array arr[] consisting of non-negative integers, the task is to find the number of ways to split the array into three non-empty contiguous subarrays such that their respective sum of elements are in increasing order.
Examples:
Input: arr[] = {2, 3, 1, 7}
Output: 2
Explanation:
{{2}, {3, 1}, {7}}, {{2}, {3}, {1, 7}} are the possible splits.
Input: arr[] = {1, 2, 0}
Output: 0
Approach: The idea is to use the Prefix and Suffix sum array and Two Pointers technique. Follow the steps below to solve the problem:
- Generate the prefix sum array and suffix sum array.
- Initialize two pointers s and e to find the sum of the second subarray.
- Iterate over the array, increment curr_subarray_sum with arr[e] while curr_subarray_sum less than prefix_sum[s – 1] and keep incrementing e.
- Whenever curr_subarray_sum is ? prefix_sum[s – 1], then check if curr_subarray_sum is ? suffix_sum[e]. If found to be true, increment count.
- Reduce curr_subarray_sum by arr[s] and increment s.
- Repeat the above steps and finally, print count
Below is the implementation of the above approach:
C++
#include<bits/stdc++.h>
using namespace std;
int findCount( int arr[], int n)
{
int prefix_sum[n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++)
prefix_sum[i] = prefix_sum[i - 1] + arr[i];
int suffix_sum[n];
suffix_sum[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffix_sum[i] = suffix_sum[i + 1] + arr[i];
int s = 1, e = 1;
int curr_subarray_sum = 0, count = 0;
while (s < n - 1 && e < n - 1)
{
while (e < n - 1 && curr_subarray_sum <
prefix_sum[s - 1])
{
curr_subarray_sum += arr[e++];
}
if (curr_subarray_sum <= suffix_sum[e])
{
count++;
}
curr_subarray_sum -= arr[s++];
}
return count;
}
int32_t main()
{
int arr[] = { 2, 3, 1, 7 };
int n = sizeof arr / sizeof arr[0];
cout << (findCount(arr, n));
}
|
Java
import java.io.*;
import java.util.*;
class GFG {
static int findCount( int arr[], int n)
{
int [] prefix_sum = new int [n];
prefix_sum[ 0 ] = arr[ 0 ];
for ( int i = 1 ; i < n; i++)
prefix_sum[i]
= prefix_sum[i - 1 ] + arr[i];
int [] suffix_sum = new int [n];
suffix_sum[n - 1 ] = arr[n - 1 ];
for ( int i = n - 2 ; i >= 0 ; i--)
suffix_sum[i]
= suffix_sum[i + 1 ] + arr[i];
int s = 1 , e = 1 ;
int curr_subarray_sum = 0 , count = 0 ;
while (s < n - 1 && e < n - 1 ) {
while (e < n - 1
&& curr_subarray_sum
< prefix_sum[s - 1 ]) {
curr_subarray_sum += arr[e++];
}
if (curr_subarray_sum <= suffix_sum[e]) {
count++;
}
curr_subarray_sum -= arr[s++];
}
return count;
}
public static void main(String args[])
{
int [] arr = { 2 , 3 , 1 , 7 };
int n = arr.length;
System.out.println(findCount(arr, n));
}
}
|
Python3
def findCount(arr, n):
prefix_sum = [ 0 for x in range (n)]
prefix_sum[ 0 ] = arr[ 0 ]
for i in range ( 1 , n):
prefix_sum[i] = prefix_sum[i - 1 ] + arr[i]
suffix_sum = [ 0 for x in range (n)]
suffix_sum[n - 1 ] = arr[n - 1 ]
for i in range (n - 2 , - 1 , - 1 ):
suffix_sum[i] = suffix_sum[i + 1 ] + arr[i]
s = 1
e = 1
curr_subarray_sum = 0
count = 0
while (s < n - 1 and e < n - 1 ):
while (e < n - 1 and
curr_subarray_sum < prefix_sum[s - 1 ]):
curr_subarray_sum + = arr[e]
e + = 1
if (curr_subarray_sum < = suffix_sum[e]):
count + = 1
curr_subarray_sum - = arr[s]
s + = 1
return count
arr = [ 2 , 3 , 1 , 7 ]
n = len (arr)
print (findCount(arr, n))
|
C#
using System;
class GFG{
static int findCount( int []arr, int n)
{
int [] prefix_sum = new int [n];
prefix_sum[0] = arr[0];
for ( int i = 1; i < n; i++)
prefix_sum[i] = prefix_sum[i - 1] + arr[i];
int [] suffix_sum = new int [n];
suffix_sum[n - 1] = arr[n - 1];
for ( int i = n - 2; i >= 0; i--)
suffix_sum[i] = suffix_sum[i + 1] + arr[i];
int s = 1, e = 1;
int curr_subarray_sum = 0, count = 0;
while (s < n - 1 && e < n - 1)
{
while (e < n - 1 &&
curr_subarray_sum < prefix_sum[s - 1])
{
curr_subarray_sum += arr[e++];
}
if (curr_subarray_sum <= suffix_sum[e])
{
count++;
}
curr_subarray_sum -= arr[s++];
}
return count;
}
public static void Main(String []args)
{
int [] arr = { 2, 3, 1, 7 };
int n = arr.Length;
Console.WriteLine(findCount(arr, n));
}
}
|
Javascript
<script>
function findCount(arr, n)
{
let prefix_sum = Array.from({length: n},
(_, i) => 0);
prefix_sum[0] = arr[0];
for (let i = 1; i < n; i++)
prefix_sum[i]
= prefix_sum[i - 1] + arr[i];
let suffix_sum = Array.from({length: n},
(_, i) => 0);
suffix_sum[n - 1] = arr[n - 1];
for (let i = n - 2; i >= 0; i--)
suffix_sum[i]
= suffix_sum[i + 1] + arr[i];
let s = 1, e = 1;
let curr_subarray_sum = 0, count = 0;
while (s < n - 1 && e < n - 1) {
while (e < n - 1
&& curr_subarray_sum
< prefix_sum[s - 1]) {
curr_subarray_sum += arr[e++];
}
if (curr_subarray_sum <= suffix_sum[e]) {
count++;
}
curr_subarray_sum -= arr[s++];
}
return count;
}
let arr = [ 2, 3, 1, 7 ];
let n = arr.length;
document.write(findCount(arr, n));
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(N)
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!