[LeetCode]532. K-diff Pairs in an Array 解题报告(C++)

[LeetCode]532. K-diff Pairs in an Array 解题报告(C++)

题目描述

Given an array of integers and an integer k, you need to find the number of unique k-diff pairs in the array. Here a k-diff pair is defined as an integer pair (i, j), where i and j are both numbers in the array and their absolute difference is k.

Example 1:

Input: [3, 1, 4, 1, 5], k = 2
Output: 2
Explanation: There are two 2-diff pairs in the array, (1, 3) and (3, 5).
Although we have two 1s in the input, we should only return the number of unique pairs.

Example 2:

Input:[1, 2, 3, 4, 5], k = 1
Output: 4
Explanation: There are four 1-diff pairs in the array, (1, 2), (2, 3), (3, 4) and (4, 5).

Example 3:

Input: [1, 3, 1, 5, 4], k = 0
Output: 1
Explanation: There is one 0-diff pair in the array, (1, 1).

Note:

  1. The pairs (i, j) and (j, i) count as the same pair.
  2. The length of the array won’t exceed 10,000.
  3. All the integers in the given input belong to the range: [-1e7, 1e7].

题目大意

  • 输入为数组和 数k
  • 找到数组中绝对值为k的(i,j).
  • 输出一共有多少对.
  • 注意: (i,j)和(j,i)视为一样的

解题思路

方法1:

  • 通过统计数组中每个数字的个数和出现次数的映射
  • 遍历哈希表
  • 若k=0. 如果数字出现字数大于一个,则res++;
  • 若k不为0,用当前数字加上k之后得到的新数字若也在数组中,则res++;
代码实现:
class Solution0 {
public:
    int findPairs(vector<int>& nums, int k) {
        int n = nums.size();
        int res = 0;
        unordered_map<int, int> m;
        for (int x : nums) {
            m[x]++;
        }
        for (auto it : m) {
            if (k == 0 && it.second>1) {
                res++;
            }
            if (k > 0 && m.count(it.first+k)) {
                ++res;
            }
        }
        return res;
    }
};

方法2:

  • 不使用哈希表.改用双指针
  • 给数组排序!
    1. 遍历数组,找到当前数字之后 和 当前数 差不小于k 的数.
    2. 若这个数.与二者刚好差为k.则res++;
  • 遍历过程注意跳过数字相同
代码实现:
class Solution {
public:
    int findPairs(vector<int>& nums, int k) {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        int res = 0;
        int i, j = 0;
        for (i = 0; i < n; i++) {
            j = max(i + 1, j); // 更新索引号.
            // 寻找 当前数字后的与当前数字差不小于k的数字
            while (j < n && nums[j] - nums[i] < k) {
                j++;
            }
            // 若二者差恰好为k,结果++;
            if (j < n&&nums[j] - nums[i] == k) {
                ++res;
            }
            // 跳过重复的数字
            while (i < n - 1 && nums[i] == nums[i + 1]) {
                i++;
            }
        }
        return res;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值