Number of Ways to Split Array

Updated on 27 June, 2025
Number of Ways to Split Array header image

Problem Statement

In this task, we are given a 0-indexed integer array nums with n elements. Our goal is to determine the number of valid splits in this array. A split at index i is considered valid if it satisfies two conditions:

  • The summation of the elements from the beginning of the array up to index i (inclusive) must be greater than or equal to the sum of the elements from index i + 1 to the end.
  • The split index i must leave at least one element to the right, which means it must satisfy the condition 0 <= i < n - 1.

We need to count and return the number of such valid splits in the array nums.

Examples

Example 1

Input:

nums = [10,4,-8,7]

Output:

2

Explanation:

There are three ways of splitting nums into two non-empty parts:
- Split nums at index 0. Then, the first part is [10], and its sum is 10. The second part is [4,-8,7], and its sum is 3. Since 10 >= 3, i = 0 is a valid split.
- Split nums at index 1. Then, the first part is [10,4], and its sum is 14. The second part is [-8,7], and its sum is -1. Since 14 >= -1, i = 1 is a valid split.
- Split nums at index 2. Then, the first part is [10,4,-8], and its sum is 6. The second part is [7], and its sum is 7. Since 6 < 7, i = 2 is not a valid split.
Thus, the number of valid splits in nums is 2.

Example 2

Input:

nums = [2,3,1,0]

Output:

2

Explanation:

There are two valid splits in nums:
- Split nums at index 1. Then, the first part is [2,3], and its sum is 5. The second part is [1,0], and its sum is 1. Since 5 >= 1, i = 1 is a valid split.
- Split nums at index 2. Then, the first part is [2,3,1], and its sum is 6. The second part is [0], and its sum is 0. Since 6 >= 0, i = 2 is a valid split.

Constraints

  • 2 <= nums.length <= 105
  • -105 <= nums[i] <= 105

Approach and Intuition

To efficiently determine the number of valid splits in the array nums, consider the following approach:

  1. Calculate the total sum of the array. This gives us a reference to quickly calculate any segment of the array without iterating through it multiple times.

  2. Track the cumulative sum of elements as you iterate from the start. This allows you to know the sum of the subarray from the beginning up to any index i instantaneously.

  3. Determine the sum of the elements to the right of an index i using the formula right_sum = total_sum - cumulative_sum[i], where cumulative_sum[i] is the sum of elements from the start up to the index i.

  4. For each index starting from 0 up to n - 2, check if cumulative_sum[i] is greater than or equal to right_sum. If true, it constitutes a valid split.

Using cumulative sums reduces time complexity, as each index check becomes a constant-time operation after the initial sum calculations.

Illustration with Examples:

  • For nums = [10, 4, -8, 7], after calculating the total sum and progressively calculating the cumulative sums, we can directly compare these sums split-wise:
    • Index 0 split gives the sums for [10] and [4, -8, 7]. Check if the sum of [10] ≥ sum of [4, -8, 7].
    • Continue this for indices 1 and 2 as described, ensuring the cumulative sum is always greater or equal to the right sum for a valid split.

This model allows quick evaluations of potential splits and is well-suited to handle the worst case scenarios defined by the constraints, considering the lengths up to 10^5 and element bounds from -10^5 to 10^5.

Solutions

  • C++
  • Java
  • Python
cpp
class Solution {
public:
    int countValidSplits(vector<int>& numbers) {
        long long sumLeft = 0, sumRight = 0;
    
        // Initially calculate the total of all elements
        for (int value : numbers) {
            sumRight += value;
        }
    
        int validSplits = 0;
        // Evaluate each split point
        for (int i = 0; i < numbers.size() - 1; i++) {
            sumLeft += numbers[i];
            sumRight -= numbers[i];
    
            // Check the conditions for a valid split
            if (sumLeft >= sumRight) {
                validSplits++;
            }
        }
    
        return validSplits;
    }
};

The provided C++ solution focuses on finding the number of valid ways to split an array into two non-empty subarrays such that the sum of the elements in the left subarray is greater than or equal to the sum of the elements in the right subarray. The solution implementation follows these steps:

  1. Initialize sumLeft to zero, representing the initial sum of the left subarray, and sumRight to the sum of all elements in the numbers array, representing the initial sum of the right subarray.
  2. Iterate over the elements of the array until the second last element. For each element, proceed with the following sub-steps:
    • Add the current element to sumLeft.
    • Subtract the current element from sumRight.
    • Check if the sum of the left subarray is now greater than or equal to the sum of the right subarray. If true, increment a counter validSplits.
  3. Return the count validSplits, which indicates the number of valid split points that satisfy the condition.

The approach efficiently makes use of a single pass through the array besides the initial calculation of the total sum of elements, ensuring an overall time complexity of O(n), where n is the number of elements in the input array.

java
class Solution {
    
    public int countValidSplits(int[] elements) {
        long sumLeft = 0, sumRight = 0;
    
        for (int value : elements) {
            sumRight += value;
        }
    
        int validSplits = 0;
        for (int index = 0; index < elements.length - 1; index++) {
            sumLeft += elements[index];
            sumRight -= elements[index];
    
            if (sumLeft >= sumRight) {
                validSplits++;
            }
        }
    
        return validSplits;
    }
}

The provided Java solution addresses the problem of counting the number of valid splits in an array. A split is considered valid if the sum of the elements on the left side of the split is greater than or equal to the sum on the right side. The method countValidSplits operates by iterating through the array while maintaining and updating the sum of the elements to the left and right of the current index. Follow the sequence of operations carried out by the provided code:

  • Initialize both sumLeft and sumRight. sumLeft starts at 0, while sumRight is initially the sum of all elements in the array.
  • Loop through each element in the array up to the second-to-last element, to consider all possible splits.
    • For each element at the current index, add its value to sumLeft and subtract the same value from sumRight.
    • Check if sumLeft is greater than or equal to sumRight.
      • If true, increment the validSplits counter.
  • The loop completes after evaluating all possible splits, and the count of valid splits is returned.

This method efficiently calculates the required count in linear time, relative to the size of the input array, by leveraging a single pass through the array and simple arithmetic operations. This ensures that the function performs well even for larger arrays.

python
class Solution:
    def countValidSplits(self, values: list[int]) -> int:
        # Sums of the elements on either side of the split
        sum_left = sum_right = 0
    
        # Start with all elements in sum_right
        sum_right = sum(values)
    
        # Count the number of valid splits
        valid_splits = 0
        for index in range(len(values) - 1):
            # Update sums for left and right
            sum_left += values[index]
            sum_right -= values[index]
    
            # Increment count if conditions are met
            if sum_left >= sum_right:
                valid_splits += 1
    
        return valid_splits

The problem focuses on counting valid ways to split an array so that the sum of the elements on the left side of the split is at least as great as the sum of the elements on the right. The provided solution is implemented in Python.

Here is a concise breakdown of the implemented approach:

  • Initialize two variables, sum_left and sum_right, to store the cumulative sums of the array elements to the left and right of the current position, respectively.
  • Initially, set sum_right to the sum of all the elements in the array, since no elements are yet included in sum_left.
  • Iterate through the array, stopping one element short of the last to ensure there is at least one element on the right side.
    • For each element at the current index, transfer its value from sum_right to sum_left.
    • Check if the current split is valid, i.e., if sum_left is greater than or equal to sum_right. If valid, increment the valid_splits counter.
  • Return the total count of valid splits.

This solution effectively splits the array at each possible division between two consecutive elements, computationally shifting the element balance between the left and right sums, and checks for the validity condition after each shift. It ensures that every valid partition is counted, leveraging a single pass through the array with constant updates to the sums and a simple condition check.

Comments

No comments yet.