leetcode0954. 二倍数对数组-medium
1 题目:二倍数对数组
官方标定难度:中
给定一个长度为偶数的整数数组 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 < = a r r . l e n g t h < = 3 ∗ 10 4 0 <= arr.length <= 3 * 10^4 0<=arr.length<=3∗104
arr.length 是偶数
− 10 5 < = a r r [ i ] < = 10 5 -10^5 <= arr[i] <= 10^5 −105<=arr[i]<=105
2 solution
按照绝对值从大到小排序,如果有 2x 和 x 匹配,将 2x 数量减 1,否则 将 x 的 数量加 1,如果最终还有没有匹配的,则返回 false。
代码
class Solution {/** 题目大意:判断是否能将长度为 2n 的 arr 划分为 n 对 (x、 2x)*/
public:bool canReorderDoubled(vector<int> &arr) {std::sort(arr.begin(), arr.end(), [](int a, int b) {return abs(a) > abs(b);});unordered_map<int, int> l;for (int i: arr) {if (l[i * 2]) {l[i * 2]--;} else {l[i]++;}}for (auto x: l)if (x.second) return false;return true;}
};