思路
使用动态规划算出四个数组. 对于元素x
qianji[] x前面奇数和
qianou[]
houji[]
houou[]
然后遍历查看
qianji+houou=qianou+houji
代码
// 312-p0128 生成平衡数组方案数
public int waysToMakeFair(int[] nums) {
int Jsum=0,Osum=0; // 奇偶和
for (int i = 0; i < nums.length; i++) {
if (i%2==0){
Osum+=nums[i];
}else {
Jsum+=nums[i];
}
}
// 从后往前遍历,计算元素
int[] qianJi=new int[nums.length];
int[] qianOu=new int[nums.length];
int[] houJi=new int[nums.length];
int[] houOu=new int[nums.length];
for (int i = nums.length-1; i >=0 ; i--) {
if (i==nums.length-1){
if (i%2==0){//下标为偶数时
qianJi[i]=Jsum;
qianOu[i]=Osum-nums[i];
}else {
qianJi[i]=Jsum-nums[i];
qianOu[i]=Osum;
}
houJi[i]=0;
houOu[i]=0;
continue;
}
if (i%2==0){//下标为偶数时
qianOu[i]=qianOu[i+1]-nums[i];
qianJi[i]=qianJi[i+1];
// 后面一个为奇数
houJi[i]=houJi[i+1]+nums[i+1];
houOu[i]=houOu[i+1];
}else {
qianJi[i]=qianJi[i+1]-nums[i];
qianOu[i]=qianOu[i+1];
// 后面一个是偶数
houJi[i]=houJi[i+1];
houOu[i]=houOu[i+1]+nums[i+1];
}
}
int res=0;
for (int i = 0; i < nums.length; i++) {
if (qianJi[i]+houOu[i]==qianOu[i]+houJi[i]){
res++;
}
}
return res;
}