• 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)

  • 相关阅读:
    快速创建一个 Servlet 项目(1)
    快速创建一个 Servlet 项目(2)
    多级派生情况下派生类的构造函数
    最近看了点C++,分享一下我的进度吧!
    进程同步&进程间通信
    multiprocess模块
    进程
    网络编程之socket
    网络通信原理
    网络通信的流程 | 初始socket
  • 原文地址:https://www.cnblogs.com/xxxsans/p/13787191.html
Copyright © 2020-2023  润新知