我想找出将一个数组分成三个连续部分的方法数,使得这三个部分的和相等。
-10^9 <= A[i] <= 10^9
我的方法: 接收输入并检查基本情况:
for(int i=0;i<n;i++){
a[i]= in.nextLong();
sum+=a[i];
}
if(sum%3!=0)System.out.println("0");
如果以上方法都不行,那么可以考虑计算前缀和和后缀和。
for(int i=1;i<=n-2;i++){
xx+=a[i-1];
if(xx==sum/3){
dp[i]=1;
}
}
后缀和与更新二叉索引树:
for(int i=n ;i>=3;i--){
xx+=a[i-1];
if(xx==sum/3){
update(i, 1, suffix);
}
}
现在简单地循环数组以找到总方法:
int ans=0;
for(int i=1;i<=n-2;i++){
if(dp[i]==1)
{
ans+= (query(n, suffix) - query(i+1, suffix));
// Checking For the Sum/3 in array where index>i+1
}
}
我使用上述方法得到了错误的答案。
我不知道哪里出错了,请帮助我纠正错误。
更新和查询功能:
public static void update(int i , int value , int[] arr){
while(i<arr.length){
arr[i]+=value;
i+=i&-i;
}
}
public static int query(int i ,int[] arr){
int ans=0;
while(i>0){
ans+=arr[i];
i-=i&-i;
}
return ans;
}
3 0 3 0 3
是否给出了正确答案。 - user4447943else
代码会给我一个答案0,我已经测试了你提供给我的输入,它给出了正确的答案。 - user4447943