Input: nums =[1,2,1,2,1,2,1]Output: trueExplanation:
i =1, j =3, k =5.sum(0, i -1)= sum(0,0)=1sum(i +1, j -1)= sum(2,2)=1sum(j +1, k -1)= sum(4,4)=1sum(k +1, n -1)= sum(6,6)=1
We want to find three split points (i, j, k) such that the sums of four subarrays are equal. By using prefix sums, we can efficiently compute subarray sums and use a hash set to track possible sums for the first two splits, then check for a matching sum in the third split.
classSolution {
publicbooleansplitArray(int[] nums) {
int n = nums.length;
int[] pre =newint[n+1];
for (int i = 0; i < n; ++i) pre[i+1]= pre[i]+ nums[i];
for (int j = 3; j < n-3; ++j) {
Set<Integer> s =new HashSet<>();
for (int i = 1; i < j-1; ++i) {
int sum1 = pre[i];
int sum2 = pre[j]- pre[i+1];
if (sum1 == sum2) s.add(sum1);
}
for (int k = j+2; k < n-1; ++k) {
int sum3 = pre[k]- pre[j+1];
int sum4 = pre[n]- pre[k+1];
if (sum3 == sum4 && s.contains(sum3)) returntrue;
}
}
returnfalse;
}
}
classSolution {
funsplitArray(nums: IntArray): Boolean {
val n = nums.size
val pre = IntArray(n+1)
for (i in0 until n) pre[i+1] = pre[i] + nums[i]
for (j in3 until n-3) {
val s = mutableSetOf<Int>()
for (i in1 until j-1) {
val sum1 = pre[i]
val sum2 = pre[j] - pre[i+1]
if (sum1 == sum2) s.add(sum1)
}
for (k in j+2 until n-1) {
val sum3 = pre[k] - pre[j+1]
val sum4 = pre[n] - pre[k+1]
if (sum3 == sum4 && s.contains(sum3)) returntrue }
}
returnfalse }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
defsplitArray(nums: list[int]) -> bool:
n = len(nums)
pre = [0] * (n+1)
for i in range(n):
pre[i+1] = pre[i] + nums[i]
for j in range(3, n-3):
s = set()
for i in range(1, j-1):
sum1 = pre[i]
sum2 = pre[j] - pre[i+1]
if sum1 == sum2:
s.add(sum1)
for k in range(j+2, n-1):
sum3 = pre[k] - pre[j+1]
sum4 = pre[n] - pre[k+1]
if sum3 == sum4 and sum3 in s:
returnTruereturnFalse
impl Solution {
pubfnsplit_array(nums: Vec<i32>) -> bool {
let n = nums.len();
letmut pre =vec![0; n+1];
for i in0..n {
pre[i+1] = pre[i] + nums[i];
}
for j in3..n-3 {
letmut s = std::collections::HashSet::new();
for i in1..j-1 {
let sum1 = pre[i];
let sum2 = pre[j] - pre[i+1];
if sum1 == sum2 {
s.insert(sum1);
}
}
for k in j+2..n-1 {
let sum3 = pre[k] - pre[j+1];
let sum4 = pre[n] - pre[k+1];
if sum3 == sum4 && s.contains(&sum3) {
returntrue;
}
}
}
false }
}