前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 0954. 二倍数对数组

LeetCode 0954. 二倍数对数组

原创
作者头像
Yano_nankai
修改2021-02-24 15:17:34
3050
修改2021-02-24 15:17:34
举报
文章被收录于专栏:二进制文集二进制文集

题目描述

题目链接

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

示例 1:

代码语言:txt
复制
输入:arr = [3,1,3,6]
输出:false

示例 2:

代码语言:txt
复制
输入:arr = [2,1,2,6]
输出:false

示例 3:

代码语言:txt
复制
输入:arr = [4,-2,2,-4]
输出:true
解释:可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]

示例 4:

代码语言:txt
复制
输入:arr = [1,2,4,16,8,4]
输出:false

解题思路

题目稍微复杂一点的地方在于:有正数和负数的存在,两者的处理正好是相反的,因为一个负数* 2,这个数反而会更小。

整体思路是:

  • 对数组按照绝对值排序
  • 维护一个 map count,key 是数组里的数值,value 是该数值出现的次数
  • 从左向右遍历数组(已经按照绝对值排序)
    • 如果该值 x 的 value 是 0,continue
    • 如果 x2 的 value<=0,则不符合条件直接返回 false,因为 x 次数不为 0,却缺少 x2
    • 对 x 和 x*2 的 value 分别-1

代码

代码语言:txt
复制
class Solution {
    public boolean canReorderDoubled(int[] A) {
        Map<Integer, Integer> count = new HashMap<>();
        for (int x : A)
            count.put(x, count.getOrDefault(x, 0) + 1);

        Integer[] B = new Integer[A.length];
        for (int i = 0; i < A.length; ++i)
            B[i] = A[i];
        Arrays.sort(B, Comparator.comparingInt(Math::abs));

        for (int x : B) {
            if (count.get(x) == 0) continue;
            if (count.getOrDefault(2 * x, 0) <= 0) return false;
            
            count.put(x, count.get(x) - 1);
            count.put(2 * x, count.get(2 * x) - 1);
        }
        return true;
    }
}

复杂度分析

  • 时间复杂度:因为进行了排序,所以复杂度是 O(nlogn)
  • 空间复杂度:O(n)

GitHub LeetCode 项目

项目 GitHub LeetCode 全解,欢迎大家 star、fork、merge,共同打造最全 LeetCode 题解!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目描述
  • 解题思路
  • 代码
  • 复杂度分析
  • GitHub LeetCode 项目
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档