C ++中的双对数组
假设我们有一个长度为偶数的整数A的数组,现在,当且仅当可能以A[2*i+1]=2*A[2*i]重新排序时,我们才必须说true每0<=i<len(A)/2。因此,如果输入类似于[3,1,3,6],则结果为false,其中[4,-2,2,-4]为将返回true。
为了解决这个问题,我们将遵循以下步骤-
创建一个映射m,n:=A的大小,将A中每个元素的频率存储到映射m中
cnt:=A的大小
对于映射中的每个键值对kv
如果m[kv的键]不为0并且m[2*kv的键]>0
否则,当kv=0时,则
x:=m[kv的键]和m[2*kv的键]的最小值
cnt:=cnt–(x*2)
将m[2*kv键]减少x
将m[kv的键]减少x
cnt:=cnt–m[kv的键]
m[kv的键]:=0
如果m[kv的键]>0,则
当cnt为非零时返回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