题目
954.二倍数对数组
题目大意
给定一个长度为偶数的整数数组 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 ∗ 1 0 4 0 <= arr.length <= 3 * 10^4 0<=arr.length<=3∗104
arr.length
是偶数- − 1 0 5 < = a r r [ i ] < = 1 0 5 -10^5 <= arr[i] <= 10^5 −105<=arr[i]<=105
思路
定义哈希表unordered_map<int,int>mp
记录每种元素的数量,数组vector<int>a
记录所有种类的元素(保证互不重复)。特殊的元素
0
0
0只能和
0
0
0匹配,所以必须满足
m
p
[
0
]
=
0
mp[0]=0
mp[0]=0,否则return 0
。对于vector<int>a
需要将它们进行排序,绝对值小的在前面,这样每次枚举x
,必须满足
m
p
[
2
×
x
]
>
=
m
p
[
x
]
mp[2\times x]>=mp[x]
mp[2×x]>=mp[x],这样才可以优先将绝对值小的数字消耗掉,如果不满足就return 0
,直到最后都满足才return 1
。
代码
// short int long float double bool char string void
// array vector stack queue auto const operator
// class public private static friend extern
// sizeof new delete return cout cin memset malloc
// relloc size length memset malloc relloc size length
// for while if else switch case continue break system
// endl reverse sort swap substr begin end iterator
// namespace include define NULL nullptr exit equals
// index col row arr err left right ans res vec que sta
// state flag ch str max min default charray std
// maxn minn INT_MAX INT_MIN push_back insert
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
typedef pair<int, string>PIS;
const int maxn=5e4+50;//注意修改大小
long long read(){long long x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;}
ll qpow(ll x,ll q,ll Mod){ll ans=1;while(q){if(q&1)ans=ans*x%Mod;q>>=1;x=(x*x)%Mod;}return ans%Mod;}
bool cmp(int x,int y){
return abs(x)<abs(y);
}
class Solution {
public:
bool canReorderDoubled(vector<int>& arr) {
unordered_map<int,int>mp;
vector<int>a;
for(auto it:arr){
mp[it]++;
if(mp[it]==1){
a.push_back(it);
}
}
if(mp[0]%2)return 0;
sort(a.begin(),a.end(),cmp);
for(auto x:a){
if(mp[2*x]<mp[x])return 0;
mp[2*x]-=mp[x];
}
return 1;
}
};