我遇到了一个问题,让你删除数组中的两个元素,使得三个部分的和相等。
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)?
谢谢