假设我们有一个由正整数组成的数组A,可以说该数组是正方形的,如果对于每对相邻元素,它们的和是一个完美的平方。我们必须找到平方的A的排列数。当且仅当存在一些索引i使得A1 [i]与A2 [i]不同时,两个置换A1和A2才会相同。
因此,如果输入像[3,30,6],那么输出将为2,因为我们有两个排列,例如[3,6,30],[30,6,3]。
为了解决这个问题,我们将遵循以下步骤-
定义一个函数isSqr()
,将花费n,
x:= n的平方根
当(x * x)与n相同时返回true
定义一个函数solve()
,它将使用一个数组a,idx,
如果(idx与0或isSqr(a [idx-1] + a [i]))和a [i]未访问,则-
swap(a [idx],a [i])
解决(a,idx + 1)
swap(a [idx],a [i])
在访问过的地方插入一个[i]
(增加1)
返回
如果idx与a的大小相同,则-
定义一组参观
对于初始化i:= idx,当i <a的大小时,更新(将i增加1),执行-
从主要方法中,执行以下操作-
计数:= 0
解决(a,0)
返回计数
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int count; bool isSqr(lli n){ lli x = sqrt(n); return x * x == n; } void solve(vector<int>& a, int idx){ if (idx == a.size()) { count++; return; } set<int> visited; for (int i = idx; i < a.size(); i++) { if ((idx == 0 || isSqr(a[idx - 1] + a[i])) && !visited.count(a[i])) { swap(a[idx], a[i]); solve(a, idx + 1); swap(a[idx], a[i]); visited.insert(a[i]); } } } int numSquarefulPerms(vector<int>& a){ count = 0; solve(a, 0); return count; } }; main(){ Solution ob; vector<int> v = {3,30,6}; cout << (ob.numSquarefulPerms(v)); }
{3,30,6}
输出结果
2