0954. 二倍数对数组
大约 2 分钟
---
0954. 二倍数对数组
- 标签:贪心、数组、哈希表、排序
- 难度:中等
题目链接
题目大意
描述:
给定一个长度为偶数的整数数组 。
要求:
只有对 进行重组后可以满足「对于每个 ,都有 」时,返回 true;否则,返回 false。
说明:
- 。
- 是偶数。
- 。
示例:
- 示例 1:
输入:arr = [3,1,3,6]
输出:false- 示例 2:
输入:arr = [2,1,2,6]
输出:false解题思路
思路 1:贪心 + 哈希表
思路
这道题要求判断数组能否重组为二倍数对的形式,即 。
我们可以使用贪心策略:
- 统计频次:使用哈希表统计每个数字出现的次数。
- 排序:按绝对值从小到大排序。这样可以保证先处理较小的数,避免遗漏。
- 贪心匹配:对于每个数 ,如果它还有剩余次数,就尝试找它的二倍 :
- 如果 的次数不足,返回
False。 - 否则,将 和 的次数都减 。
- 如果 的次数不足,返回
- 如果所有数都能成功匹配,返回
True。
注意:需要按绝对值排序,因为负数的二倍关系是 和 ,而不是 和 。
代码
class Solution:
def canReorderDoubled(self, arr: List[int]) -> bool:
from collections import Counter
# 统计每个数字的出现次数
count = Counter(arr)
# 按绝对值从小到大排序
for x in sorted(count, key=abs):
# 如果 x 还有剩余次数
if count[x] > 0:
# 检查 2x 的次数是否足够
if count[2 * x] < count[x]:
return False
# 匹配 x 和 2x
count[2 * x] -= count[x]
return True复杂度分析
- 时间复杂度:,其中 是数组长度。主要时间消耗在排序上。
- 空间复杂度:,需要哈希表存储每个数字的频次。