Python程序:计算相邻对之和为完全平方数的排列数
假设我们有一个名为nums的数字列表。我们必须找到nums的排列数,使得每对相邻值的和都是完全平方数。当存在某个索引i使得A[i]与B[i]不同时,两个排列A和B是唯一的。
因此,如果输入类似于nums = [2, 9, 7],则输出将为2,因为我们有[2, 7, 9]和[9, 7, 2]
为了解决这个问题,我们将遵循以下步骤:
res := 0
定义一个函数util()。这将接收i作为参数
如果i + 1等于nums的大小,则
res := res + 1
返回
visited := 一个新的空集合
对于j从i + 1到nums的大小,执行以下操作:
s := nums[i] + nums[j]
如果s未被访问过并且(s的平方根)^2等于s,则
标记s为已访问
交换nums[i + 1]和nums[j]
util(i + 1)
交换nums[i + 1]和nums[j]
在主方法中执行以下操作:
visited := 一个新的集合
对于i从0到nums的大小,执行以下操作:
交换nums[i]和nums[0]
如果nums[0]未被访问过,则
util(0)
标记nums[0]为已访问
交换nums[i]和nums[0]
返回res
让我们看下面的实现来更好地理解:
示例
from math import sqrt class Solution: def solve(self, nums): self.res = 0 def util(i): if i + 1 == len(nums): self.res += 1 return visited = set() for j in range(i + 1, len(nums)): s = nums[i] + nums[j] if s not in visited and int(sqrt(s)) ** 2 == s: visited.add(s) nums[i + 1], nums[j] = nums[j], nums[i + 1] util(i + 1) nums[i + 1], nums[j] = nums[j], nums[i + 1] visited = set() for i in range(len(nums)): nums[i], nums[0] = nums[0], nums[i] if nums[0] not in visited: util(0) visited.add(nums[0]) nums[i], nums[0] = nums[0], nums[i] return self.res ob = Solution() nums = [2, 9, 7] print(ob.solve(nums))
输入
[2, 9, 7]
输出
2
广告