---
# System prepended metadata

title: 0954. Array of Doubled Pairs
tags: [Leetcode, Google, Medium]

---

# 0954. Array of Doubled Pairs
###### tags: `Leetcode` `Medium` `Google`
Link: https://leetcode.com/problems/array-of-doubled-pairs/
## 思路 $O(N+klogk)$ $O(k)$
和[2007. Find Original Array From Doubled Array](https://hackmd.io/Y-esg71RQ5iNb5Knm5K0pA)差不多
$k$是unique number的数量
首先将数字都存到map里统计frequency
然后排序
这里要注意对于一个数$a$，如果$a<0$，下一个数是$a/2$，如果$a>0$，下一个数是$a*2$，记$a$出现的频率为$count$, 下一个数（$a/2$或$a*2$）出现的频率为$count2$
- 如果$count=0$，什么都不做
- 如果$count>count2$，则return false，因为多余的$a$一定组不成pair
- 其他情况说明$a$可以组成pair，那么就把$a$和$a$的下一个数在map里对应的值减掉$count$

之所以不用像[2007. Find Original Array From Doubled Array](https://hackmd.io/Y-esg71RQ5iNb5Knm5K0pA)那样特别考虑0，是因为这里不需要计算出现了几次0，只要知道0出现了偶数次就可以了，因为arr的长度已经说了是偶数，所以只要其他的数都合法（没有return false），0出现的次数也一定是偶数，当$a=0$的时候，$cnt$里面0对应的值会被减成负数，但是没有关系
## Code
```java=
class Solution {
    public boolean canReorderDoubled(int[] arr) {
        Map<Integer, Integer> cnt = new HashMap<>();
        for(int num:arr){
            cnt.put(num, cnt.getOrDefault(num, 0)+1);
        }
        List<Integer> keys = new ArrayList<>(cnt.keySet());
        Collections.sort(keys);
        for(int num:keys){
            int count = cnt.get(num);
            if(count==0) continue;
            else if(num<0 && num%2!=0) return false;
            int next = num<0?num/2:num*2;
            if(cnt.getOrDefault(next,0)<count) return false;
            cnt.put(num, 0);
            cnt.put(next, cnt.get(next)-count);
        }
        return true;
    }
}
```