方法一:
思路与算法
使用 4 个 int 分别保存被删除位置左边和右边的奇数位和、偶数位和。
- 求出奇数、偶数位置的总和
- 遍历尝试删除每个位置,更新删除后的总和,左右总和相加,判断是否满足条件
- 更新删除位置左边的总和
代码
class Solution {
public int waysToMakeFair(int[] nums) {
// 奇数位置的总和,偶数位置的总和
int odd1 = 0, even1 = 0;
// 被删除的数的左边奇数位置的总和,偶数位置的总和
int odd2 = 0, even2 = 0;
int n = nums.length;
for (int i = 0; i < n; i++) {
if ((i & 1) == 0) {
even1 += nums[i];
} else {
odd1 += nums[i];
}
}
int res = 0;
for (int i = 0; i < n; i++) {
if ((i & 1) == 0) {
// 删除偶数位
even1 -= nums[i];
} else {
// 删除奇数位
odd1 -= nums[i];
}
// 满足要求的方案:奇数位的和 == 偶数位的和
// even1:删除后变成新数组的奇数位数的和,odd1:删除后变成新数组的偶数位置的和
if (even1 + odd2 == even2 + odd1) {
res++;
}
if ((i & 1) == 0) {
// 保存被删除的元素左边的偶数
even2 += nums[i];
} else {
// 保存被删除的元素左边的奇数
odd2 += nums[i];
}
}
return res;
}
}
复杂度分析
时间复杂度:O(n),两次遍历
空间复杂度:O(1),常数空间