栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数组中的 k-diff 数对 c++ map

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数组中的 k-diff 数对 c++ map

题目内容

给定一个整数数组和一个整数 k,你需要在数组里找到 不同的 k-diff 数对,并返回不同的 k-diff 数对 的数目。

这里将 k-diff 数对定义为一个整数对 (nums[i], nums[j]),并满足下述全部条件:

  • 0 <= i < j < nums.length
  • |nums[i] - nums[j]| == k

注意,|val| 表示 val 的绝对值。

样例
输入:nums = [3, 1, 4, 1, 5], k = 2
输出:2
解释:数组中有两个 2-diff 数对, (1, 3) 和 (3, 5)。
尽管数组中有两个1,但我们只应返回不同的数对的数量。

提示:

  • 1 <= nums.length <= 10^4
  • -10^7 <= nums[i] <= 10^7
  • 0 <= k <= 10^7
解题思路

题目要求判断数组中有多少对不同的且差值为 k 的对数。
通过for循环暴力遍历肯定是会超时的,因为需要每两个数作比较。
所以我们使用map记录数据的出现次数,判断与当前数 x 差值为 k 的数是否出现,就可以找到对应数对。

我们先初始化 map

    map  re;
    for(int i = 0; i < nums.size(); i++){
        re[nums[i]]++;
    }

再通过迭代器遍历

    int ans = 0;
    map::iterator it;
    for (it = re.begin(); it != re.end(); it++) {
        int x = it->first;
        if(re.count(x-k) && k != 0) ans ++;
        else if(re.count(x-k) && re[x-k] > 1){
            ans++;
        }
    }

这里只判断 x-k 是否存在,因为判断 k-x 是否存在会在之后 re[k-x] 判断重复计数一次。
这里还需要判断 k 是否为 0,因为 k = 0 的时候 re.count(x-k) 始终成立,但实际需要两个相同数才能组成对应数对,所以对此特判。

代码
class Solution {
public:
    int findPairs(vector& nums, int k) {
        //初始化哈希表
        map  re;
        sort(nums.begin(),nums.end());
        for(int i = 0; i < nums.size(); i++){
            re[nums[i]]++;
        }

        //遍历计数
        int ans = 0;
        map::iterator it;
        for (it = re.begin(); it != re.end(); it++) {
            int x = it->first;
            if(re.count(x-k) && k != 0) ans ++;
            else if(re.count(x-k) && re[x-k] > 1){
                ans++;
            }
        }
        return ans;
    }
};

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/k-diff-pairs-in-an-array

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/976632.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号