길이가 짝수인 정수 A의 배열이 있다고 가정하고 A[2 * i + 1] =2 * A[2 * i]와 같은 방식으로 재정렬할 수 있는 경우에만 true라고 말해야 합니다. 모든 0 <=i
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
맵 생성 m, n :=A의 크기, A에 있는 각 요소의 빈도를 맵 m에 저장
cnt :=A의 크기
맵의 각 키-값 쌍 kv에 대해
m[kv의 키]> 0이면
m[kv의 키]가 0이 아니고 m[2* kv의 키]> 0
x :=m[kv의 키] 및 m[2* kv의 키]의 최소값
cnt :=cnt – (x * 2)
m[2 * kv의 키] x
m[kv의 키]를 x만큼 감소
그렇지 않으면 kv의 키가 0이면
cnt :=cnt – m[kv의 키]
m[kv의 키] :=0
cnt가 0이 아니면 false를 반환하고, 그렇지 않으면 true를 반환합니다.
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
예시
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool canReorderDoubled(vector<int>& A) {
map <int, int> m;
int n = A.size();
for(int i = 0; i < n; i++){
m[A[i]]++;
}
int cnt = A.size();
map <int, int> :: iterator it = m.begin();
while(it != m.end()){
if(m[it->first] > 0){
if(it->first != 0 && m[it->first * 2] > 0){
int x = min(m[it->first], m[it->first * 2]);
cnt -= (x * 2);
m[it->first * 2] -= x;
m[it->first] -= x;
}else if(it->first == 0){
cnt -= m[it->first];
m[it->first] = 0;
}
}
it++;
}
return !cnt;
}
};
main(){
vector<int> v1 = {3,1,3,6};
Solution ob;
cout << (ob.canReorderDoubled(v1)) << endl;
v1 = {4,-2,2,-4};
cout << (ob.canReorderDoubled(v1));
}
입력
[3,1,3,6]
[4,-2,2,-4]
출력
0
1