Given an array A
of non-negative integers, the array is squareful if for every pair of adjacent elements, their sum is a perfect square.
Return the number of permutations of A that are squareful. Two permutations A1
and A2
differ if and only if there is some index i
such that A1[i] != A2[i]
.
Example 1:
Input: [1,17,8]
Output: 2
Explanation:
[1,8,17] and [17,8,1] are the valid permutations.
Example 2:
Input: [2,2,2]
Output: 1
Note:
1 <= A.length <= 12
0 <= A[i] <= 1e9
给定一个非负整数数组 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
Runtime: 8 ms
Memory Usage: 18.9 MB
1 class Solution { 2 var ans:Int = 0 3 func numSquarefulPerms(_ A: [Int]) -> Int { 4 var A = A 5 ans = 0 6 dfs(&A,0) 7 return ans 8 } 9 10 func dfs(_ A:inout [Int],_ k:Int) 11 { 12 var n:Int = A.count 13 if k == n 14 { 15 ans += 1 16 } 17 else 18 { 19 var set:Set<Int> = Set<Int>() 20 for i in k..<n 21 { 22 if (k == 0 || sq(A[k - 1] + A[i])) && !set.contains(A[i]) 23 { 24 set.insert(A[i]) 25 swap(&A, k, i) 26 dfs(&A, k + 1) 27 swap(&A, k, i) 28 } 29 } 30 } 31 } 32 33 func sq(_ n:Int) -> Bool 34 { 35 var r = Int(sqrt(Double(n))) 36 return r * r == n 37 } 38 39 func swap(_ A:inout [Int],_ i:Int,_ j:Int) 40 { 41 var temp:Int = A[i] 42 A[i] = A[j] 43 A[j] = temp 44 } 45 }