Given an array
nums which consists of non-negative integers and an integer
m, you can split the array into
m non-empty continuous subarrays.
Write an algorithm to minimize the largest sum among these
Input: nums = [7,2,5,10,8], m = 2 Output: 18 Explanation: There are four ways to split nums into two subarrays. The best way is to split it into [7,2,5] and [10,8], where the largest sum among the two subarrays is only 18.
Input: nums = [1,2,3,4,5], m = 2 Output: 9
Input: nums = [1,4,4], m = 3 Output: 4
1 <= nums.length <= 1000
0 <= nums[i] <= 106
1 <= m <= min(50, nums.length)
One approach to solving the problem is to use binary search. We can use binary search to search for a largest subarray sum which can make the array split into m parts. The lower bound of the largest subarray sum is the maximum number of the array when m equals the length of the array. The higher bound is the sum of the array when m equals 1. We can base on how many pieces split to adjust the largest subarray sum value.
class Solution: def splitArray(self, nums: List[int], m: int) -> int: """ :type nums: List[int] :type m: int :rtype: int """ n = len(nums) start = max(nums) end = sum(nums) while start + 1< end: mid = start + (end - start) // 2 if self.split_into_pieces(nums, mid) > m: start = mid + 1 else: end = mid if self.split_into_pieces(nums, start) <= m: return start return end def split_into_pieces(self, nums, largest_sum): previous_sum = 0 pieces = 1 for num in nums: if previous_sum + num > largest_sum: previous_sum = num pieces += 1 else: previous_sum += num return pieces
- Time Complexity: O(Nlog(N))
- Space Complexity: O(1)