假设我们有一个长度为偶数的整数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