一、问题描述
给你一个整数数组 nums
,它包含 2 * n
个整数。
你需要将 nums
划分成 n
个数对,满足:
- 每个元素 只属于一个 数对。
- 同一数对中的元素 相等 。
如果可以将 nums
划分成 n
个数对,请你返回 true
,否则返回 false
。
题目链接:将数组划分成相等数对
二、题目要求
样例
输入: nums = [3,2,3,2,2,2] 输出: true 解释: nums 中总共有 6 个元素,所以它们应该被划分成 6 / 2 = 3 个数对。 nums 可以划分成 (2, 2) ,(3, 3) 和 (2, 2) ,满足所有要求。
考察
简单模拟判断、位运算 建议用时10~35min
三、问题分析
1.模拟
这一题做法很多,我一开始是将数组从小到大排序,之后两个为一组判断就行了。
也不要判断到循环结束,只要一组的两个数组不相等,直接返回false就行了。
2.位运算
位运算可以将两个相同的数字异或为0,那我们把数组从头到尾异或计算,假如输出为0,那么就符合条件。
但这种方法有个bug,就是即使是不相等数对异或的结果也可能为0,所以倒数第二个样例过不去。
四、编码实现
classSolution { public: booldivideArray(vector<int>&nums) { inti,n=nums.size(); sort(nums.begin(),nums.end());//排序for(i=0;i<n-1;i+=2)//两两一组 { if(nums[i]!=nums[i+1])//不相等returnfalse;//返回错误 } returntrue;//返回正确 } };