文章目录
- 题目描述
- 简化题目
- 思路分析
- Counter 与 哈希表的区别
- 完整代码
题目描述
给定一个长度为偶数的整数数组 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
解释:可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]
简化题目
这道题的意思就是给你一个数组,你要把她分成 N组,每组里有两个数,且每组中第二个数是第一个数的两倍。
思路分析
首先建立哈希表,然后对其key的绝对值进行排序。
关键点就是 判断当前值所存在的个数是否小于当前值两倍的存在个数,因为如果为大于,则必有X无值匹配。匹配成功后,要减去匹配所用掉的值的个数(这也是为什么要用哈希表的原因)。
比如:
直接用示例3 :
arr = [4,-2,2,-4]
- 对arr构造哈希表 hs = {4: 1, -2: 1, 2: 1, -4: 1}
- 使用sorted对其key的绝对值进行排序, temp = [-2, 2, 4, -4]
- 遍历temp,如果 hs[-2] > hs [-2 * 2] 也就是说 -2存在的个数比 -4存在的个数多,则返回False。
- 此时 -2已经匹配完了,但是-4有可能还要继续作为较小值的一方和其他元素匹配,所以要 减去和 -2匹配用掉的个数。
Counter 与 哈希表的区别
这里有一个东西要记一下,Python3 里的Counter构造出来的是计数器,虽然形式上看着和哈希表差不多,但并不是哈希表。 区别就是 使用哈希表中没有的key时会报错,而如果用Counter生成的,当使用其中没有的key时,返回0,毕竟计数器嘛,没有的key就是0喽。
完整代码
class Solution:
def canReorderDoubled(self, arr: List[int]) -> bool:
from collections import Counter
hs = Counter(arr)
s = sorted(hs,key=abs)
for i in s:
if hs[i] > hs[i*2]:
return False
hs[i*2] -= hs[i]
return True