力扣第 74 场双周赛 :将数组划分成相等数对

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、问题描述

给你一个整数数组 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) ,满足所有要求。
复制代码

考察

1.简单模拟判断、位运算
2.建议用时10~35min
复制代码

三、问题分析

1.模拟

这一题做法很多,我一开始是将数组从小到大排序,之后两个为一组判断就行了。

也不要判断到循环结束,只要一组的两个数组不相等,直接返回false就行了。

2.位运算

没了解过位运算相关知识点可以看这一篇文章,讲解比较详细:

算法题每日一练---第45天:位运算

位运算可以将两个相同的数字异或为0,那我们把数组从头到尾异或计算,假如输出为0,那么就符合条件。

但这种方法有个bug,就是即使是不相等数对异或的结果也可能为0,所以倒数第二个样例过不去。

2.png

四、编码实现

class Solution {
public:
    bool divideArray(vector<int>& nums) {
        int i,n=nums.size();
        sort(nums.begin(),nums.end());//排序
        for(i=0;i<n-1;i+=2)//两两一组
        {
            if(nums[i]!=nums[i+1])//不相等
                return false;//返回错误
        }
        return true;//返回正确    
    }
};
复制代码

五、测试结果

3.png

1.png

猜你喜欢

转载自juejin.im/post/7079214860944277512