难度:中等
给定一个长度为偶数的整数数组
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;
}

该博客讨论了一个编程问题,涉及给定一个偶数长度的整数数组,判断是否能通过重组使得每个奇数索引的元素是偶数索引元素的两倍。示例展示了不同情况下的解决方案,并提供了相关代码实现。代码通过建立映射、排序和检查元素的二倍关系来判断重组可能性。
1726

被折叠的 条评论
为什么被折叠?



