2270. Number of Ways to Split Array
2270. Number of Ways to Split Array
[Problem]
Intuition
- Problem is about getting the sum of a given range. Prefix Sum can help us in that case.
- Recommended: A good reference for understanding prefix sum approach is this article by @wingkwong
Approach
- Calculate prefix sum for
numsand store them inprefixarray. - Total sum is sum of all values in
nums, i.e.totalSum = prefix[n] - Sum of first
ivalues is given bysumFirst = prefix[i + 1] Sum of last
n-i-1values is given bysumLast, i.e.sumLast = totalSum - sumFirst- To check:
1 2 3
sumFirst >= sumLast sumFirst >= totalSum - sumFirst 2*sumFirst >= totalSum
- Hence the condition to check is reduced to
2*sumFirst >= totalSum - For each
i, check this condition, if true, increment no. of valid splitsvalidSplits.
Complexity Analysis
- Time Complexity: O(n)
- Traversing the array once for prefix sum (
O(n)), and once for counting valid splits (O(n)), wherenisnums.length
- Traversing the array once for prefix sum (
- Space Complexity: O(n)
- Space taken by
prefixarray.
- Space taken by
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public int waysToSplitArray(int[] nums) {
int n = nums.length;
long[] prefix = new long[n + 1]; // long to prevent overflow
// compute prefix sum
for(int i = 0; i < n; i++){
prefix[i + 1] = prefix[i] + nums[i];
}
long totalSum = prefix[n];
int validSplits = 0;
for(int i = 0; i < n - 1; i++){
long sumFirst = prefix[i + 1];
/*
sumLast = totalSum - sumFirst;
To check
sumFirst >= sumLast
sumFirst >= totalSum - sumFirst
2*sumFirst >= totalSum
*/
if(2*sumFirst >= totalSum){
validSplits += 1;
}
}
return validSplits;
}
}
This post is licensed under CC BY 4.0 by the author.