- 生成平衡数组的方案数
给你一个整数数组 nums 。你需要选择 恰好 一个下标(下标从 0 开始)并删除对应的元素。请注意剩下元素的下标可能会因为删除操作而发生改变。
比方说,如果 nums = [6,1,7,4,1] ,那么:
选择删除下标 1 ,剩下的数组为 nums = [6,7,4,1] 。
选择删除下标 2 ,剩下的数组为 nums = [6,1,4,1] 。
选择删除下标 4 ,剩下的数组为 nums = [6,1,7,4] 。
如果一个数组满足奇数下标元素的和与偶数下标元素的和相等,该数组就是一个 平衡数组 。
请你返回删除操作后,剩下的数组 nums 是 平衡数组 的 方案数 。
暴力加了一点点优化果然不行
class Solution {
public:
bool judge(vector<int>& nums, int index) {
int fir = 0, sec = 0;
for (int i = 0; i < nums.size(); i++) {
if (i == index) {
swap(fir, sec);
} else {
if (i % 2 == 0) {
sec += nums[i];
} else {
fir += nums[i];
}
}
}
return fir == sec;
}
int waysToMakeFair(vector<int>& nums) {
int add = 0;
int res = 0;
for (int num : nums) {
add += num;
}
if (add % 2 == 0) {
for (int i = 0; i < nums.size(); i++) {
if (nums[i] % 2 == 0 && judge(nums, i)) {
res++;
}
}
} else {
for (int i = 0; i < nums.size(); i++) {
if (nums[i] % 2 == 1 && judge(nums, i)) {
res++;
}
}
}
return res;
}
};
class Solution {
public:
int waysToMakeFair(vector<int>& nums) {
int res=0,n=nums.size();
int sum_odd=0,sum_even=0,left_odd=0,left_even=0,right_odd=0,right_even=0;
//初始化sum_odd,sum_even
for(int i=0;i<n;i++) i%2?sum_odd+=nums[i]:sum_even+=nums[i];
for(int i=0;i<n;i++){
//计算left_odd,left_even
i%2?left_odd+=nums[i]:left_even+=nums[i];
//计算right_odd,right_even
right_odd=sum_even-left_even;
right_even=sum_odd-left_odd;
//减掉元素本身
i%2?right_odd-=nums[i]:right_even-=nums[i];
//判等
if(left_odd+right_odd==left_even+right_even)res++;
}
return res;
}
};