양의 정수로 구성된 배열 A가 있다고 가정하고 인접한 요소의 모든 쌍에 대해 합이 완전 제곱이면 배열은 제곱이라고 말할 수 있습니다. 제곱인 A의 순열 수를 찾아야 합니다. 두 순열 A1과 A2는 A1[i]가 A2[i]와 같지 않은 인덱스 i가 있는 경우에만 동일하지 않습니다.
따라서 입력이 [3,30,6]과 같으면 [3,6,30], [30,6,3]과 같은 두 개의 순열이 있으므로 출력은 2가 됩니다.
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
isSqr() 함수를 정의하면 n이 필요합니다.
-
x :=n의 제곱근
-
(x * x)가 n
과 같을 때 true를 반환합니다.
-
-
solve() 함수를 정의하면 배열 a, idx,
가 사용됩니다.-
idx가 크기와 같으면 -
-
(1씩 증가)
-
반환
-
-
방문한 한 세트 정의
-
initialize i :=idx의 경우 i
-
(idx가 0 또는 isSqr(a[idx - 1] + a[i]))이고 a[i]가 방문하지 않은 경우 -
-
스왑(a[idx], a[i])
-
해결(a, idx + 1)
-
스왑(a[idx], a[i])
-
방문
에 [i] 삽입
-
-
-
-
기본 방법에서 다음을 수행하십시오 -
-
개수 :=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