📅  最后修改于: 2023-12-03 15:39:36.120000             🧑  作者: Mango
给定一个整数数组,计算其中元素总和为完美平方数的子数组的数量。
“完美平方数”指的是一个整数的平方数。
示例:
输入: nums = [1,4,2,3,5,8,9], 输出: 2
解释:子数组 [1,4,2] 和 [9] 的总和分别是 9 和 81,都是完美平方数。
枚举所有可能的子数组,并计算它们的总和是否为完美平方数。
时间复杂度:O(n^3)
计算前缀和数组,然后遍历前缀和数组,对于每个前缀和,计算在它前面的所有前缀和中,与它的差是否为完美平方数。
时间复杂度:O(n^2)
利用哈希表记录前缀和中每个数出现的次数。遍历前缀和数组时,对于每个前缀和,查找哈希表中有多少相减为完美平方数的前缀和。
时间复杂度:O(n)
以下为哈希表方法的代码实现:
def countSquareSumSubarrays(nums: List[int]) -> int:
prefix_sum = 0
count = 0
hash_map = collections.defaultdict(int)
hash_map[0] = 1
for num in nums:
prefix_sum += num
sqrt_val = int(math.sqrt(prefix_sum))
if sqrt_val ** 2 == prefix_sum:
count += hash_map[prefix_sum - sqrt_val ** 2]
hash_map[prefix_sum] += 1
return count
本题主要考察哈希表的应用,并且可以从暴力法、前缀和、哈希表三个方面来实现。在实际使用中,哈希表方法是最优解,时间复杂度为O(n)。