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
nums
and store them inprefix
array. - Total sum is sum of all values in
nums
, i.e.totalSum = prefix[n]
- Sum of first
i
values is given bysumFirst = prefix[i + 1]
Sum of last
n-i-1
values 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)
), wheren
isnums.length
- Traversing the array once for prefix sum (
- Space Complexity: O(n)
- Space taken by
prefix
array.
- 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.