给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组。
返回 A 的正方形排列的数目。两个排列 A1 和 A2 不同的充要条件是存在某个索引 i,使得 A1[i] != A2[i]。
示例 1:
输入:[1,17,8]
输出:2
解释:
[1,8,17] 和 [17,8,1] 都是有效的排列。
示例 2:
输入:[2,2,2]
输出:1
提示:
1 <= A.length <= 12
0 <= A[i] <= 1e9
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-squareful-arrays
哈密顿路径
class Solution: def numSquarefulPerms(self, A: List[int]) -> int: # if len(A)==1:return 0 def is_square(i): return i == math.isqrt(i) ** 2 # def ok(a): # for i in range(len(a)-1): # if not is_square(a[i]+a[i+1]): # return False # return True # res=[] # for p in itertools.permutations(A): # if ok(p): # res.append(p) # return len(set(res)) n=len(A) cnt=collections.Counter(A) graph={x:[] for x in cnt} for x in cnt: for y in graph: if is_square(x+y): graph[x].append(y) def dfs(x,do): cnt[x]-=1 if do==0: res=1 else: res=0 for y in graph[x]: if cnt[y]: res+=dfs(y,do-1) cnt[x]+=1 return res return sum(dfs(x,n-1) for x in cnt)