难度:中等
给定一个长度为偶数的整数数组
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]提示:
0 <= arr.length <= 3 *
arr.length
是偶数-105 <= arr[i] <=
代码:
public boolean canReorderDoubled(int[] arr) {
//key为数字,value为出现次数
Map<Integer, Integer> map = new HashMap<>(16);
for (int i = 0; i < arr.length; i++) {
map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
}
//去掉所有的0,0的个数不为偶数必然不行
if (map.getOrDefault(0, 0) % 2 != 0) {
return false;
}
//将key放入list
List<Integer> list = new ArrayList<>();
for (Integer key : map.keySet()) {
list.add(key);
}
//根据绝对值大小排序
Collections.sort(list, Comparator.comparingInt(Math::abs));
//判断有无二倍关系
for (Integer x : list) {
//判断x和2x的数目是不是能对得上,不够则不行
if (map.getOrDefault(2 * x, 0) < map.get(x)) {
return false;
}
//能匹配上,则去除map里2x的相应个数
map.put(2 * x, map.getOrDefault(2 * x, 0) - map.get(x));
}
return true;
}