📅  最后修改于: 2023-12-03 15:41:39.272000             🧑  作者: Mango
给定一个整数数组,计算有多少种不同的组合方式,可以表示为两个完全平方数之和。
对于给定的整数 x,如果它可以表示为两个完全平方数之和,那么 x 的因子中一定包括某两个数 m 和 n,使得 x = m^2 + n^2。
因此,我们可以遍历所有的 m 和 n 的可能取值,判断它们的平方和是否等于给定的整数 x。为了减少计算量,我们可以限制 m 和 n 的取值范围为 [0, sqrt(x)]。
另外,为了避免重复计算,我们可以将已经计算过的数保存下来,之后再次用到时可以直接调用,不需要重新计算。
Python 代码如下:
import math
def count_two_squares(nums):
squares = set()
count = 0
for i in range(int(math.sqrt(max(nums))) + 1):
squares.add(i * i)
for x in nums:
for y in nums:
if x != y and x + y in squares:
count += 1
squares.remove(x + y)
return count
我们首先将所有小于等于数组中最大值的完全平方数保存在集合 squares 中。之后,我们遍历数组中的每个元素 x 和每个元素 y,判断它们的平方和是否在集合 squares 中。如果存在,说明 x 和 y 可以表示为两个完全平方数之和,结果 count 加 1,并从集合 squares 中将这个和移除,避免重复计算。
本题可以用两重循环暴力解决,时间复杂度为 O(n^2)。为了减少计算量,我们可以用集合保存已经计算过的完全平方数,避免重复计算。