[Swift Weekly Contest 124]LeetCode996. 正方形数组的数目 | Number of Squareful Arrays

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. 1 <= A.length <= 12
  2. 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. 1 <= A.length <= 12
  2. 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 }

猜你喜欢

转载自www.cnblogs.com/strengthen/p/10390780.html