给定一个长度为偶数的整数数组 arr,只有对 arr 进行重组后可以满足 “对于每个 0 ,都有 arr2 * 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]
示例 4:
输入:arr = [1,2,4,16,8,4]
输出:false
题目稍微复杂一点的地方在于:有正数和负数的存在,两者的处理正好是相反的,因为一个负数* 2,这个数反而会更小。
整体思路是:
class Solution {
public boolean canReorderDoubled(int[] A) {
Map<Integer, Integer> count = new HashMap<>();
for (int x : A)
count.put(x, count.getOrDefault(x, 0) + 1);
Integer[] B = new Integer[A.length];
for (int i = 0; i < A.length; ++i)
B[i] = A[i];
Arrays.sort(B, Comparator.comparingInt(Math::abs));
for (int x : B) {
if (count.get(x) == 0) continue;
if (count.getOrDefault(2 * x, 0) <= 0) return false;
count.put(x, count.get(x) - 1);
count.put(2 * x, count.get(2 * x) - 1);
}
return true;
}
}
项目 GitHub LeetCode 全解,欢迎大家 star、fork、merge,共同打造最全 LeetCode 题解!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。