给定一个长度为偶数的整数数组 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
思路:
判断整个数组是否可以凑成二倍数对,我们知道0的二倍还是0,而其他数的二倍直接乘以2即可,那么我们可以统计一下每个数的个数,然后从小的数开始进行匹配,这样如果整个数组最后都能匹配上,说明这是个二倍数对数组。
当然也要考虑负数的情况,进行排序的时候,负数其实应该是从最大的进行匹配,那么可以根据绝对值进行排序。
class Solution:
def canReorderDoubled(self, arr: List[int]) -> bool:
#统计数组中的数出现的次数
cache = collections.defaultdict(int)
for i in arr:
cache[i] += 1
# 如果出现0且0的次数是奇数,肯定不是二倍数对数组
if cache[0] % 2: return False
# 根据key的绝对值进行排序,然后比较i和2i的次数大小
# 如果i的次数比2i的次数大,说明多余的i不能匹配到数据,返回False
# 这个时候需要将2i的次数减掉,用于匹配2*2i
for i in sorted(cache.keys(), key=abs):
if cache[i] > cache[2*i]: return False
cache[2*i] -= cache[i]
return True