Split Array Largest Sum [Hard] — Binary Search on Answer

Sanjeev SharmaSanjeev Sharma
1 min read

Advertisement

Problem Statement

Split array into m non-empty subarrays to minimize the largest subarray sum.

Input: nums=[7,2,5,10,8], m=2Output: 18

Intuition

Binary search on the answer (min possible = max element, max = total sum). For each mid, greedily check if we can split into ≤ m groups each with sum ≤ mid.


Solutions

C++

bool canSplit(vector<int>& nums, int m, long long limit) {
    int groups=1; long long cur=0;
    for (int n:nums) { if(cur+n>limit){groups++;cur=0;} cur+=n; }
    return groups<=m;
}
int splitArray(vector<int>& nums, int m) {
    long long lo=*max_element(nums.begin(),nums.end()), hi=accumulate(nums.begin(),nums.end(),0LL);
    while(lo<hi){long long mid=(lo+hi)/2;canSplit(nums,m,mid)?hi=mid:lo=mid+1;}
    return lo;
}

Python

def splitArray(nums: list[int], m: int) -> int:
    def feasible(limit):
        groups, cur = 1, 0
        for n in nums:
            if cur + n > limit:
                groups += 1; cur = 0
            cur += n
        return groups <= m

    lo, hi = max(nums), sum(nums)
    while lo < hi:
        mid = (lo + hi) // 2
        if feasible(mid): hi = mid
        else: lo = mid + 1
    return lo

Complexity

  • Time: O(n log(sum))
  • Space: O(1)

DP Alternative: O(n²m)

dp[i][j] = min largest sum splitting first i elements into j groups.

Advertisement

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro