![]() |
VOOZH | about |
Given an integer array arr[], the task is to divide the array into three non-empty contiguous segments with equal sum. In other words, we need to return an index pair [i, j], such that sum(arr[0...i]) = sum(arr[i+1...j]) = sum(arr[j+1...n-1]).
Note: If it is impossible to divide the array into three non-empty contiguous segments, return [-1, -1].
Examples:
Input: arr[] = [1, 3, 4, 0, 4]
Output: [1, 2]
Explanation: 3 equal sum segments are: arr[0...1], arr[2...2] and arr[3...4] each having sum = 4.Input: arr[] = [2, 3, 4]
Output: [-1, -1]
Explanation: No three segments exist which has equal sum.Input: arr[] = [1, -1, 1, -1, 1, -1, 1, -1]
Output: [1, 3]
Explanation: 3 equal sum segments are: arr[0...1], arr[2...3] and arr[4...7] each having sum = 0.
Table of Content
The idea is to try all possible partitions using two variables, say i and j such that the first segment will be arr[0...i], the second segment will be arr[i+1...j] and the third segment will be arr[j+1...n-1]. For any partition, if the sum of all three segments are equal, then we can return [i, j] as a valid partition. Otherwise, return [-1, -1].
1 2
To split the array into three equal segments, we first need to make sure that the total sum of the array is divisible by 3. Then, as we iterate through the array, we calculate the running sum. If running sum becomes equal to one-third of the total, we reset the running sum to zero and store the index as the first element of the index pair. If we find another index for which the running sum becomes equal to one-third of the total and there are still elements left for a third segment, then store the index as the second element of the index pair and return the index pair.
We only need the first two segments with sum equal to one-third of the total because the remaining subarray will always be the third segment.
Working:
1 2