996. 正方形数组的数目

给定一个非负整数数组 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)

 

posted @ 2020-10-09 17:56  XXXSANS  阅读(180)  评论(0编辑  收藏  举报