将数组划分成相等数对

标签: 位运算 数组 哈希表 计数

难度: Easy

给你一个整数数组 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

Submission

运行时间: 28 ms

内存: 16.1 MB

class Solution:
    def divideArray(self, nums: List[int]) -> bool:
        counter = Counter(nums)
        
        for num in counter:
            if counter[num] % 2 != 0:
                return False
            
        return True

Explain

此题解采用哈希表记录数组中每个元素的出现次数,然后检查每个元素的计数是否为偶数。如果所有元素的计数都是偶数,则说明可以将数组划分成n个数对,其中每个数对的两个元素相同。如果任何一个元素的计数为奇数,则无法形成完全配对的数对,应返回false。

时间复杂度: O(n)

空间复杂度: O(n)

class Solution:
    def divideArray(self, nums: List[int]) -> bool:
        # 使用Counter统计数组中每个元素的出现次数
        counter = Counter(nums)
        # 遍历每个元素的计数
        for num in counter:
            # 检查元素出现的次数是否为偶数
            if counter[num] % 2 != 0:
                return False # 若为奇数,直接返回False
        return True # 所有元素出现次数都是偶数,返回True

Explore

哈希表在此问题中非常有效,因为它可以快速地统计数组中每个元素的出现次数。哈希表提供了常数时间复杂度的插入和查找操作,使得整个算法的时间复杂度可以控制在O(n),其中n是数组的长度。此外,使用哈希表可以直接访问任何元素的计数,方便进行后续的偶数检查,从而快速决定是否可以将数组划分成相等的数对。

在数组中,如果一个元素的出现次数是偶数,说明它可以完全配对,即每两个相同的元素可以形成一个数对。检查哈希表中每个元素的出现次数是否为偶数,确保了每种元素都能找到对应的配对元素,从而可以形成n个数对。如果所有元素的出现次数都是偶数,那么数组总数也是偶数,且每个元素都能完美配对,满足题目要求的数对划分。

在本题的上下文中,如果任何元素的计数是奇数,那么至少有一个元素无法找到配对,因此无法将数组完全划分为相等的数对。因此,这种方法不会错过其他潜在的解决方案。如果数组中有奇数个某个元素,根本无法形成完全的配对,即使考虑其他元素的组合方式也无法解决这一点。

除了使用哈希表,还可以考虑使用排序方法。首先对数组进行排序,然后依次检查相邻的两个元素是否相同。如果在排序后的数组中,所有相邻的元素都成对出现,就可以形成数对。这种方法的时间复杂度主要由排序步骤决定,通常是O(n log n)。另外,对于特定的数据范围,还可以使用数组或位运算来统计元素的出现次数,尤其是当元素值的范围有限且较小时。