📅  最后修改于: 2023-12-03 15:25:40.097000             🧑  作者: Mango
给定一个整数数组 nums
,请找出总和为完全平方数的非空子数组的数量。
输入: nums = [1, 4, 2, 3, 0, 1] 输出: 5 解释: 有以下5个子数组的总和为完全平方数:
将问题转化为:以i结尾的子数组中,有多少个子数组的总和为完全平方数。
因为子数组的长度至少是1,所以以i结尾的子数组中,总有至少一种满足要求的子数组。因此答案即为所有刚好为完全平方数的前缀和个数之和。
我们可以用一个哈希表记录所有前缀和中,值为完全平方数的个数。对于每个前缀和,我们可以用该前缀和减去一个完全平方数,得到一个新的数n,查询哈希表中值为n的元素,即可得到以i结尾的子数组中,总和为完全平方数的数量。同时,我们也需要将当前前缀和在哈希表中的出现次数加1。
def countSubarrays(nums):
n = len(nums)
prefix_sum = [0] * n
prefix_sum[0] = nums[0]
for i in range(1, n):
prefix_sum[i] = prefix_sum[i - 1] + nums[i]
ans = 0
square_set = set([i * i for i in range(int(n ** 0.5) + 1)])
count_map = {0: 1}
for s in prefix_sum:
for square in square_set:
if s - square in count_map:
ans += count_map[s - square]
if s in count_map:
count_map[s] += 1
else:
count_map[s] = 1
return ans
时间复杂度:$O(n\sqrt{n})$,其中n为nums数组的长度。因为我们需要对每个前缀和进行判断,而每个前缀和最多有sqrt(n)个可能的完全平方数分量。
空间复杂度:$O(n)$,我们使用了一个哈希表来存储每个前缀和中,值为完全平方数的个数。