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