Giả sử chúng ta có một mảng các số nguyên A với độ dài chẵn, bây giờ chúng ta phải nói đúng nếu và chỉ khi có thể sắp xếp lại nó theo cách A [2 * i + 1] =2 * A [2 * i] với mọi 0 <=i
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
Tạo một bản đồ m, n:=kích thước của A, lưu trữ tần số của từng phần tử trong A vào bản đồ m
cnt:=kích thước của A
cho mỗi cặp khóa-giá trị kv trong bản đồ
nếu m [khóa của kv]> 0, thì
nếu m [khóa của kv] không phải là 0 và m [2 * khóa của kv]> 0
x:=min of m [key of kv] và m [2 * key of kv]
cnt:=cnt - (x * 2)
giảm m [2 * khóa của kv] x
giảm m [khóa của kv] x
ngược lại khi khóa của kv =0 thì
cnt:=cnt - m [khóa của kv]
m [khóa của kv]:=0
trả về false khi cnt khác 0, ngược lại là true
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
#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));
}
Đầu vào
[3,1,3,6]
[4,-2,2,-4]
Đầu ra
0
1