#include <iostream>
#include <set>
#include <algorithm>
#include <unordered_map>
using namespace std;
// Checking duplicates with Sorting, Complexity: O(nlog(n))
bool checkDuplicatesWithSorting(int array[], int n)
{
sort(array, array+n);
for(int i = 1; i < n; i++ )
{
if(array[i]==array[i-1])
return true;
}
return false;
}
// Checking duplicates with a Set, Complexity: O(nlog(n))
bool checkDuplicatesWithSet(int array[], int n)
{
set <int> s(array, array+n);
return s.size() != n;
}
// Checking duplicates with a Hashmap, Complexity: O(n) (Average Case)
bool checkDuplicatesWithHashMap(int array[], int n)
{
unordered_map<int, bool>uo_map;
for(int i=0;i<n;i++){
if(uo_map.find(array[i]) == uo_map.end())
uo_map[array[i]] = true;
else return true;
}
return false;
}
int main() {
int arrayWithDuplicates[6] = {1,2,3,4,2,5};
int arrayWithoutDuplicates[6] = {1,2,3,4,5,6};
cout<<checkDuplicatesWithSorting(arrayWithDuplicates, 6)<<endl;
cout<<checkDuplicatesWithSorting(arrayWithoutDuplicates, 6)<<endl;
cout<<checkDuplicatesWithSet(arrayWithDuplicates, 6)<<endl;
cout<<checkDuplicatesWithSet(arrayWithoutDuplicates, 6)<<endl;
cout<<checkDuplicatesWithHashMap(arrayWithDuplicates, 6)<<endl;
cout<<checkDuplicatesWithHashMap(arrayWithoutDuplicates, 6)<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c2V0PgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vIENoZWNraW5nIGR1cGxpY2F0ZXMgd2l0aCBTb3J0aW5nLCBDb21wbGV4aXR5OiBPKG5sb2cobikpCmJvb2wgY2hlY2tEdXBsaWNhdGVzV2l0aFNvcnRpbmcoaW50IGFycmF5W10sIGludCBuKQp7CiBzb3J0KGFycmF5LCBhcnJheStuKTsKIGZvcihpbnQgaSA9IDE7IGkgPCBuOyBpKysgKQogewogCWlmKGFycmF5W2ldPT1hcnJheVtpLTFdKQogCQlyZXR1cm4gdHJ1ZTsKIH0KIHJldHVybiBmYWxzZTsKfQoKLy8gQ2hlY2tpbmcgZHVwbGljYXRlcyB3aXRoIGEgU2V0LCBDb21wbGV4aXR5OiBPKG5sb2cobikpCmJvb2wgY2hlY2tEdXBsaWNhdGVzV2l0aFNldChpbnQgYXJyYXlbXSwgaW50IG4pCnsKIHNldCA8aW50PiBzKGFycmF5LCBhcnJheStuKTsKIHJldHVybiBzLnNpemUoKSAhPSBuOwp9CgovLyBDaGVja2luZyBkdXBsaWNhdGVzIHdpdGggYSBIYXNobWFwLCBDb21wbGV4aXR5OiBPKG4pIChBdmVyYWdlIENhc2UpCmJvb2wgY2hlY2tEdXBsaWNhdGVzV2l0aEhhc2hNYXAoaW50IGFycmF5W10sIGludCBuKQp7CiB1bm9yZGVyZWRfbWFwPGludCwgYm9vbD51b19tYXA7CiBmb3IoaW50IGk9MDtpPG47aSsrKXsKIAlpZih1b19tYXAuZmluZChhcnJheVtpXSkgPT0gIHVvX21hcC5lbmQoKSkKIAkJdW9fbWFwW2FycmF5W2ldXSA9IHRydWU7CiAJZWxzZSByZXR1cm4gdHJ1ZTsKIH0KIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKSB7CmludCBhcnJheVdpdGhEdXBsaWNhdGVzWzZdID0gezEsMiwzLDQsMiw1fTsKaW50IGFycmF5V2l0aG91dER1cGxpY2F0ZXNbNl0gPSB7MSwyLDMsNCw1LDZ9Owpjb3V0PDxjaGVja0R1cGxpY2F0ZXNXaXRoU29ydGluZyhhcnJheVdpdGhEdXBsaWNhdGVzLCA2KTw8ZW5kbDsKY291dDw8Y2hlY2tEdXBsaWNhdGVzV2l0aFNvcnRpbmcoYXJyYXlXaXRob3V0RHVwbGljYXRlcywgNik8PGVuZGw7CmNvdXQ8PGNoZWNrRHVwbGljYXRlc1dpdGhTZXQoYXJyYXlXaXRoRHVwbGljYXRlcywgNik8PGVuZGw7CmNvdXQ8PGNoZWNrRHVwbGljYXRlc1dpdGhTZXQoYXJyYXlXaXRob3V0RHVwbGljYXRlcywgNik8PGVuZGw7CmNvdXQ8PGNoZWNrRHVwbGljYXRlc1dpdGhIYXNoTWFwKGFycmF5V2l0aER1cGxpY2F0ZXMsIDYpPDxlbmRsOwpjb3V0PDxjaGVja0R1cGxpY2F0ZXNXaXRoSGFzaE1hcChhcnJheVdpdGhvdXREdXBsaWNhdGVzLCA2KTw8ZW5kbDsKcmV0dXJuIDA7Cn0=