删除两个元素以在 O(n) 中将数组均匀地拆分为三部分
我遇到了一个问题,让你在数组中删除两个元素,使三个部分的总和相等。
Ex:
1 2 4 3 5 2 1
After I drop the 4 and 5, it becomes 1, 2 | 3 | 2, 1
约束:
1.Numbers are all integer > 0
2.Drop two elements in the array, so the three splitted subarrays will have same subarray sum.
我已经尝试使用双传递算法,如下所示
第一次传递:O(n)从左边算出累积的总和,这样我就可以很容易地得到范围总和。
第二遍:O(n^2) 使用嵌套循环获取子数组的开始和结束索引。然后,计算左、中、右和。
// 1.get accumulated sum map
int[] sumMap = new int[A.length];
int sum = 0;
for(int i = 0; i < A.length; i ++) {
sum += A[i];
sumMap[i] = sum;
}
// 2.try each combination
for(int i = 1; i < A.length - 1; i ++) {
for(int j = i + 1; j < A.length - 1; j ++) {
int left = sumMap[i] - A[i];
int mid = sumMap[j] - sumMap[i] - A[j];
int right = sumMap[A.length - 1] - sumMap[j];
if(left == mid && mid == right)return true;
}
}
有没有更好的算法可以实现O(n)?
谢谢