给定一个长度为偶数的整数数组 A,只有对 A 进行重组后可以满足 “对于每个 0 <= i < len(A) / 2,都有 A[2 * i + 1] = 2 * A[2 * i]” 时,返回 true;否则,返回 false。
示例 1:
输入:[3,1,3,6] 输出:false
示例 2:
输入:[2,1,2,6] 输出:false
示例 3:
输入:[4,-2,2,-4] 输出:true 解释:我们可以用 [-2,-4] 和 [2,4] 这两组组成 [-2,-4,2,4] 或是 [2,4,-2,-4]
示例 4:
输入:[1,2,4,16,8,4] 输出:false
提示:
0 <= A.length <= 30000 A.length 为偶数 -100000 <= A[i] <= 100000题解:用map标记每个元素的数目,于是我们针对负数,从大到小寻找(负数*2变得更小),针对正数,从小到大寻找,比如-2,需要一个-4,然后ans[-2]>0 and ans[-4]>0说明可以匹配,ans[-2]–,ans[-4]–,同理,如果存在ans[-2]>0 and ans[-4]==0说明没有匹配,返回false。
PS:为何负数从大到小寻找,因为一个数字,比如-2,可能为-2与-4匹配,也可能-2与-1匹配,所以需要从极端值开始遍历,从大到小寻找是因为判断乘2比较方便,如果是除2还要考虑能否整除,麻烦了。
AC代码
class Solution { public: map<int,int>ans; bool canReorderDoubled(vector<int>& A) { ans.clear(); for(int i=0;i<A.size();i++) ans[A[i]]++; vector<int>q1,q2; for(int i=0;i<A.size();i++) { if(A[i]<=0)q1.push_back(A[i]); else q2.push_back(A[i]); } sort(q1.begin(),q1.end()); sort(q2.begin(),q2.end()); for(int i=q1.size()-1;i>=0;i--) { if(ans[q1[i]]>0) { if(ans[q1[i]*2]==0)return false; if(q1[i]==0&&ans[0]<2)return false; ans[q1[i]]--; ans[q1[i]*2]--; } } for(int i=0;i<q2.size();i++) { if(ans[q2[i]]>0) { if(ans[q2[i]*2]==0)return false; ans[q2[i]]--; ans[q2[i]*2]--; } } return true; } };