夏老师有一个包含 n 个正整数的数组 a ,他想知道数组 a 中有多少个子段的和是3的倍数。 数组的子段为数组中单个或若干个连续的元素,如序列 [1],[2,3],[2,3,4] 均为数组 [1,2,3,4,5] 的子段。 当且仅当两个子段的起止下标不同时,两个子段为不同的子段。 输入数据 第一行一个整数n 。 第二行n 个整数,用单个空格隔开,表示数组a 中的各个元素。 输出数据 一个整数,数组 a 中有多少个子段的和是3的倍数。
时间: 2024-04-07 20:28:52 浏览: 87
给你一个包含n个整数的数组nums,并检查nums中是否有三个元素a、b和c使a+b+c=0?请查找总和为0且不重复的所有
这是一道经典的前缀和问题,可以使用前缀和数组来求解。我们可以先用前缀和数组 preSum[] 保存数组 a 中前缀和,即 preSum[i] 表示前 i 个数的和。那么对于一个子段 [l,r],它的和就可以表示为 preSum[r]-preSum[l-1]。因此,我们只需要枚举所有的子段,并计算子段和是否为 3 的倍数即可。
具体地,我们可以使用两个指针 l 和 r 来枚举子段的左右端点,然后计算子段和是否为 3 的倍数。由于我们只需要知道子段和是否为 3 的倍数,因此可以对子段和取模,判断取模后的结果是否为 0。
时间复杂度为 O(n^2),可以通过本题。以下是代码实现:
阅读全文