int numberOfSubarrays(vector<int>& nums, int k) {
int total = 0;
int ans = 0;
std::vector<int> prefixSum{ 1 };
for ( int num : nums ) {
if ( num % 2 != 0 ) {
total += 1;
prefixSum.push_back( 1 );
} else {
prefixSum[prefixSum.size() - 1] += 1;
}
if ( total - k < prefixSum.size() ) {
ans += prefixSum[total - k];
}
}
return ans;
}
然后,我得到了它的后续变化:“给定数字,查找最多包含k奇数的子阵列的数量”,并且需要时间复杂性是相同的,即O(n),因此自然,我再次转向前缀总和,但是我发现很难将相同的解决方案复制到此变体中。如果可以通过前缀总和来解决这个“最多”版本,那么有人会教我吗? n.B。该法规在这里不适用,只要启动和结束索引不同,子阵列被认为是不同的,例如,数组[1:3]与数组[2:4]不同,无论其元素如何相同。
完全不是前缀总和,但这个想法相似。
您的前缀总和解决方案有效地存储了每个奇数之间有多少个偶数数字。它不适用于经过修订的“最多”情况,因为它导致了过度陈述。
Instead,您可以存储每个奇数数字的索引,您可以按照您想要的时间来计算以每个数字结尾的子阵列,而o(n)的时间复杂性。
totakingnums = [8, 3, 6, 5, 2, 7]
num[0]
希望您能抓住这个想法:对于每个索引的数字,表示我们已经看到的总数为
num[1]
,每个奇数数字的索引为
nums[5]
,然后:
如果是,有一些i
子阵列,其中将total
初始化为-1,以避免在边界上进行特殊的交接。
如果是,恰好有oddNumIndices
子阵列。也请注意,空子阵列[]也适用于每个
total <= k
,因此您需要在最终答案中添加1个。
i - oddNumIndices[0]