思路一:dp
dp[i][0]表示以nums[i]结尾乘积为-1的个数。
dp[i][1]表示以nums[i]结尾乘积为1的个数。
当 sums[i] == 1时
dp[i][0] = dp[i - 1][0];
dp[i][[1] = dp[i - 1][1] + 1;
当nums[i] == -1时,
dp[i][0] = dp[i - 1][1] + 1;
dp[i][1] = dp[i - 1][0];
边界:
nums[0] == 1时, dp[0][0] = 0; dp[0][1] = 1;
nums[0] == -1时, dp[0][0] = 1; dp[0][1] = 0;
long long f(const vector<int> &nums) {
long long ans = 0;
int _0, _1;
if (nums[0] == 1) {
_0 = 0;
_1 = 1;
}else {
_0 = 1;
_1 = 0;
}
ans += _1;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] == 1) {
_1 += 1;
}else {
long long tmp = _0;
_0 = _1 + 1;
_1 = tmp;
}
ans += _1;
}
return ans;
}
思路二:区间内的乘积为1时ans++,前缀乘
思路三:当区间内-1的个数为偶数时,ans++,pre记录[0…i]出现-1的个数。