-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathduplicates.cpp
91 lines (74 loc) · 2.32 KB
/
duplicates.cpp
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
/*
* TASK: Find and Count Duplicate Elements
*
* Given an integer vector, count how many duplicates exist and list the elements
* that are duplicated.
*
* Example:
* Input: [5, 10, 15, 5, 3, 3]
* Output:
* - Count: 2 (elements 5 and 3)
* - Elements: [5, 3]
*/
#include <cassert>
#include <algorithm>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <iostream>
// Simple Solution (O(n^2) complexity due to linear search)
int countDuplicatesSimple(const std::vector<int>& arr) {
int count = 0;
std::vector<int> duplicates;
for (size_t i = 0; i < arr.size(); ++i) {
if (std::count(arr.begin(), arr.end(), arr[i]) > 1 &&
std::find(duplicates.begin(), duplicates.end(), arr[i]) == duplicates.end()) {
duplicates.push_back(arr[i]);
count++;
}
}
return count;
}
// Optimal Solution (O(n) complexity using hashing)
int countDuplicatesOptimal(const std::vector<int>& arr) {
std::unordered_map<int, int> frequency;
int duplicates = 0;
for (int num : arr)
frequency[num]++;
for (const auto& [key, value] : frequency)
if (value > 1)
duplicates++;
return duplicates;
}
// Optimal solution to return duplicate elements (O(n))
std::vector<int> findDuplicatesOptimal(const std::vector<int>& arr) {
std::unordered_map<int, int> frequency;
std::vector<int> duplicates;
for (int num : arr)
frequency[num]++;
for (const auto& [key, value] : frequency)
if (value > 1)
duplicates.push_back(key);
return duplicates;
}
// Testing
void test() {
std::vector<int> arr1{1, 2, 3, 4, 5};
assert(countDuplicatesOptimal(arr1) == 0);
assert(findDuplicatesOptimal(arr1).empty());
std::vector<int> arr2{5, 10, 15, 5, 3, 3};
assert(countDuplicatesOptimal(arr2) == 2);
auto duplicates2 = findDuplicatesOptimal(arr2);
std::sort(duplicates2.begin(), duplicates2.end());
assert(duplicates2 == std::vector<int>({3, 5}));
std::vector<int> arr3{3, 9, 9, 7, 3};
assert(countDuplicatesOptimal(arr3) == 2);
auto duplicates3 = findDuplicatesOptimal(arr3);
std::sort(duplicates3.begin(), duplicates3.end());
assert(duplicates3 == std::vector<int>({3, 9}));
std::cout << "All tests passed!\n";
}
int main() {
test();
return 0;
}