Leetcode 每日一题 2341. 数组能形成多少数对

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

个人主页:主页链接

算法专栏:专栏链接

     我会一直往里填充内容哒!

LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

代码仓库:Gitee链接

点击关注=收获更多优质内容

Leetcode 每日一题 2341. 数组能形成多少数对_第1张图片

 

这道题十分的简单 给出了两种做法,一种自己写的 一种官解,都有可取之处

目录

题目:

白话讲解:

题例:

题解:

排序消除法:

代码实现:

官解:哈希表:

代码实现:

完结撒花:


题目:

给你一个下标从 0 开始的整数数组 nums 。在一步操作中,你可以执行以下步骤:

  • 从 nums 选出 两个 相等的 整数
  • 从 nums 中移除这两个整数,形成一个 数对

请你在 nums 上多次执行此操作直到无法继续执行。

返回一个下标从 0 开始、长度为 2 的整数数组 answer 作为答案,其中 answer[0] 是形成的数对数目,answer[1] 是对 nums 尽可能执行上述操作后剩下的整数数目。

白话讲解:

返回数组中相同数字的对数,以及不成对数字的个数

题例:

输入:nums = [1,3,2,1,3,2,2]
输出:[3,1]
解释:
nums[0] 和 nums[3] 形成一个数对,并从 nums 中移除,nums = [3,2,3,2,2] 。
nums[0] 和 nums[2] 形成一个数对,并从 nums 中移除,nums = [2,2,2] 。
nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [2] 。
无法形成更多数对。总共形成 3 个数对,nums 中剩下 1 个数字。

输入:nums = [1,1]
输出:[1,0]
解释:nums[0] 和 nums[1] 形成一个数对,并从 nums 中移除,nums = [] 。
无法形成更多数对。总共形成 1 个数对,nums 中剩下 0 个数字。

题解:

排序消除法:

将数组进行排序,此时若有成对出现的数字必然是相邻的,所以创建两个指针,对相邻的数进行判断.

若这两个数字相同,则计数,i指针跳到下一对数字,

若这两个数字不同,则计数,i往下移一位

最后就是当i==n-2的时候为什么直接让不同数字的计数器直接加1呢?

我们来分析以下上面情况会使i==n-2 

1:当出现 最后两个数字不同的时候,此时只会将计数器+1,但因为最后两位了 也就是n-2的情况,所以直接再+1就行了Leetcode 每日一题 2341. 数组能形成多少数对_第2张图片

 2:当出现倒数第三个与倒数第二个数字相同的时候,此时i变位到j的地方,因为最后也只剩下一位数字了,也已经不可能相同了,所以直接+1就可以Leetcode 每日一题 2341. 数组能形成多少数对_第3张图片

也就是说,当i经历完之前的判断时,他指向的数字位数是倒数第二位的时候,无论如何最后一位都不可能与其相同(若相同 则在if中就前进了一步)

代码实现:

class Solution {
public:
    vector numberOfPairs(vector& nums) {
        int n=nums.size(),cnt=0,cnt1=0;
        if(n==1)return{0,1};
        sort(nums.begin(),nums.end());
        for(int i=0,j=1;i

Leetcode 每日一题 2341. 数组能形成多少数对_第4张图片

官解:哈希表:

创建一个以数字为key,bool值为value的哈希表,初始值均为false,

之后遍历读入每一个数字,若这个数字对应的value为false 则置为true,反之 

若被置为false 则计数器++,未成对出现的数字个数就为总长度减去成对出现的个数*2

代码实现:

class Solution {
public:
    vector numberOfPairs(vector& nums) {
        unordered_map cnt;
        int res = 0;
        for (int num : nums) {
            if (cnt.count(num)) {
                cnt[num] = !cnt[num];
            } else {
                cnt[num] = true;
            }
            if (!cnt[num]) {
                res++;
            }
        }
        return {res, (int)nums.size() - 2 * res};
    }
};

完结撒花:

本篇博客的内容【Leetcode 每日一题 2341. 数组能形成多少数对】已经结束。

若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

诸君,山顶见!

你可能感兴趣的:(小菜鸡的LeetCode之路,leetcode,算法,职场和发展)