题目链接

两倍数对数组

题目描述

image.png

实现代码

实现思路:可以对数组进行排序,这里需要按照绝对值来进行排序,因为我们要按照从左往右进行x -> 2x的查找判断;然后我们需要保存每个数的出现次数,以便于后面进行x -> 2x判断时进行扣除;

实现代码:

  1. class Solution {
  2. public boolean canReorderDoubled(int[] arr) {
  3. int len = arr.length;
  4. Map<Integer, Integer> map = new HashMap<>(len << 1);
  5. for (int val : arr) {
  6. map.put(val, map.getOrDefault(val, 0) + 1);
  7. }
  8. List<Integer> list = new ArrayList<>(map.size());
  9. for (int key : map.keySet()) {
  10. list.add(key);
  11. }
  12. Collections.sort(list, (a, b) -> Math.abs(a) - Math.abs(b));
  13. for (int key : list) {
  14. int val = map.get(key);
  15. int doubleVal = map.getOrDefault(key * 2, 0);
  16. if (doubleVal < val) {
  17. return false;
  18. }
  19. map.put(key * 2, doubleVal - val);
  20. }
  21. return true;
  22. }
  23. }