954. 二倍数对数组

215 篇文章 0 订阅

难度:中等

给定一个长度为偶数的整数数组 arr,只有对 arr 进行重组后可以满足 “对于每个 0 <= i < len(arr) / 2,都有 arr[2 * i + 1] = 2 * arr[2 * i]” 时,返回 true;否则,返回 false

示例 1:

输入:arr = [3,1,3,6]
输出:false

示例 2:

输入:arr = [2,1,2,6]
输出:false

示例 3:

输入:arr = [4,-2,2,-4]
输出:true
解释:可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]

提示:

  • 0 <= arr.length <= 3 * 10^{4}
  • arr.length 是偶数
  • -105 <= arr[i] <= 10^{5}

代码:

public boolean canReorderDoubled(int[] arr) {
        //key为数字,value为出现次数
        Map<Integer, Integer> map = new HashMap<>(16);
        for (int i = 0; i < arr.length; i++) {
            map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
        }
        //去掉所有的0,0的个数不为偶数必然不行
        if (map.getOrDefault(0, 0) % 2 != 0) {
            return false;
        }
        //将key放入list
        List<Integer> list = new ArrayList<>();
        for (Integer key : map.keySet()) {
            list.add(key);
        }
        //根据绝对值大小排序
        Collections.sort(list, Comparator.comparingInt(Math::abs));
        //判断有无二倍关系
        for (Integer x : list) {
            //判断x和2x的数目是不是能对得上,不够则不行
            if (map.getOrDefault(2 * x, 0) < map.get(x)) {
                return false;
            }
            //能匹配上,则去除map里2x的相应个数
            map.put(2 * x, map.getOrDefault(2 * x, 0) - map.get(x));
        }
        return true;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值