How to Count the Distinct Pairs using HashMap?

  • 时间:2020-09-20 13:49:13
  • 分类:网络文摘
  • 阅读:128 次

Given an array of integers and a target value, find the number of distinct pairs that sum to the target. The pairs (x,y) and (x’, y’) where x smaller or equal to y and x’ smaller or equal to y’ are considered distinct if (x,y) <= (x’, y’). As an illustration, sort the two arrays sorted(3, 2) = (2, 3). The two arrays are not distinct. The two arrays (2, 3) and (2, 4) are distinct.

For example, arr = [5, 7, 9, 13, 11, 6, 6, 3, 3], and a target value of k = 12, the 4 pairs (5, 7), (6, 6), (9, 3), (9, 3) – two instances of 3, all sum to 12 and there are only 3 distinct pairs, (5, 7), (3, 9) and (6, 6).

Sample Input:
arr = [1, 3, 46, 1, 3, 9], k = 47. There are 4 pairs where a[i] + a[j] = 4.
(1, 46), (46, 1), (46, 1) AND (1, 46) AND there is only 1 distinct pairs.

Count Distinct Pairs in C++ using unordered_map or multiset

We can sort the original numbers, and easily skip the duplicates for the first number (assuming we are always counting with a less number). However, this takes O(N.LogN) time.

We can then use a hashmap e.g. unordered_map in C++ or the std::multiset to record the number of frequencies for each number. Then for special cases such as K=A+A, we need to make sure the appearance of A is at least twice.

We can also push all the pairs into a set (unorderd_set), and simply return the number of the pairs in the set. This improves the complexity to O(N) at the cost of using additional O(N) space.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// O(nlogN) time and O(N) space
int countPairs(vector<int> arr, long k) {
    // O(nlogN) sorting
    // if we are not sorting, we may store the results using set
    // which will help us remove the duplicates
    sort(begin(arr), end(arr)); 
    // number frequencies
    unordered_map<int, int> data;
    for (const auto &n: arr) {
        data[n] ++;
    }
    int r = 0;
    for (int i = 0; i < arr.size(); i ++) {
        if ((i == 0) || (arr[i] != arr[i - 1])) { // skip duplicates
            if (data.find(k - arr[i]) != data.end()) { // find it in hash table
                if (k - arr[i] >= arr[i]) { // make sure the smaller comes first
                    if (k == arr[i] * 2) { // special case
                        if (data[arr[i]] < 2) { 
                            // duplicate number at least should appear twice
                            continue; 
                        }
                    }
                    r ++;
                }
            }
        }
    }
    return r;
}
// O(nlogN) time and O(N) space
int countPairs(vector<int> arr, long k) {
    // O(nlogN) sorting
    // if we are not sorting, we may store the results using set
    // which will help us remove the duplicates
    sort(begin(arr), end(arr)); 
    // number frequencies
    unordered_map<int, int> data;
    for (const auto &n: arr) {
        data[n] ++;
    }
    int r = 0;
    for (int i = 0; i < arr.size(); i ++) {
        if ((i == 0) || (arr[i] != arr[i - 1])) { // skip duplicates
            if (data.find(k - arr[i]) != data.end()) { // find it in hash table
                if (k - arr[i] >= arr[i]) { // make sure the smaller comes first
                    if (k == arr[i] * 2) { // special case
                        if (data[arr[i]] < 2) { 
                            // duplicate number at least should appear twice
                            continue; 
                        }
                    }
                    r ++;
                }
            }
        }
    }
    return r;
}

As a coding style, the above may have deep code indention. You may want to rewrite it with early exits – e.g. if something then continue/break.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
Freedom of Speech Isn’t So Free  10 Things You Should Do When Starting an Online Store  The Importance of Cybersecurity in Real Life  The Best Productivity Trends and Hacks of 2015  3 Great New Ways Of Generating Money With Content Online  Local SEO 101 For Law Firms [Infographic]  Make Sure You’re On Top of Google’s Mobile-Friendly Algorithm  Best Tools and Apps for Travel Bloggers  On-Page Optimization Tips to Complement Your Great Content  Responsive Design for Newbies [Infographic] 
评论列表
添加评论