Leetcode周赛 6020. 将数组划分成相等数对

188 阅读2分钟

Leetcode 6020. 将数组划分成相等数对

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1、题目📑

给你一个整数数组 nums ,它包含 2 * n 个整数。

你需要将 nums 划分成 n 个数对,满足:

每个元素 只属于一个 数对。 同一数对中的元素 相等 。 如果可以将 nums 划分成 n 个数对,请你返回 true ,否则返回 false

实例1

输入:nums = [3,2,3,2,2,2]

输出:true

解释: nums 中总共有 6 个元素,所以它们应该被划分成 6 / 2 = 3 个数对。 nums 可以划分成 (2, 2) ,(3, 3) 和 (2, 2) ,满足所有要求。

实例2

输入:nums = [1,2,3,4]

输出:false

解释: 无法将 nums 划分成 4 / 2 = 2 个数对且满足所有要求。

限制

  • nums.length == 2 * n
  • 1 <= n <= 500
  • 1 <= nums[i] <= 500

2、思路🧠

方法一:数组模拟

  1. 划分数对,满足每个数对的的元素相等,且每个元素只能划分一次,使用过之后无法再次使用。
  2. 观察到给我们的数组最大值在500之内,可以模拟510个位置,将数字中的每个值对应到数组中累加,最后统计出现的次数,这里只需要统计偶数次数,如果出现基数次数,很明显的无法与自身构成数对。
  3. 统计数对的个数必须满足,个数满足 大于 数组的个数的一半。

方法二:哈希表

思路与方法一相同,采用hash表来减少空间的复杂度。

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

class Solution {
    public boolean divideArray(int[] nums) {
        int table [] = new int[510];
        int sum = 0;
        for(int i = 0; i < nums.length; i++) {
            table[nums[i]]++;
        }
        for(int i= 0; i < table.length; i++) {
            if(table[i] % 2 ==0) sum+=table[i]/2;
        }
        if(sum >= nums.length / 2) return true;
        return false;
    }
}

时间复杂度:O(N + M) N为数组 nums 中最大的数字,M为数组 nums 的长度

空间复杂度:O(N) N为数组 nums 中最大的数字

第二次commit AC

class Solution {
    public boolean divideArray(int[] nums) {
        HashMap<Integer,Integer> map = new HashMap<>();
        for(int num : nums) {
            map.put(num,map.getOrDefault(num,0)+1);
        }
        int sum = 0;
        for(Integer k : map.keySet()) {
            if(map.get(k) % 2 ==0) sum+=map.get(k)/2;
        }
        if(sum >= nums.length / 2) return true;
        return false;
    }
}

时间复杂度:O(N) N为数组 nums 的长度

空间复杂度:O(N) N为数组 nums 的长度

image-20220320143725556

4、总结

该题目的对模拟进行考察,注意对题目的要求仔细阅读。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:6020. 将数组划分成相等数对 - 力扣(LeetCode)