Problem

Given an integer array nums, return true if any value appears at least twice in the array, and return false if every element is distinct.

Example 1: Input: nums = [1,2,3,1] Output: true Explanation: The element 1 occurs at the indices 0 and 3.

Example 2: Input: nums = [1,2,3,4] Output: false Explanation: All elements are distinct.

Example 3: Input: nums = [1,1,1,3,3,4,3,2,4,2] Output: true

Constraints:

  • 1 <= nums.length <= 105
  • -109 <= nums[i] <= 109

Solution

Sort then check - O(n log n) time - O(1) space

using namespace std;
 
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
		sort(begin(nums), end(nums));
		for (int i = 1; i < nums.size(); i++) {
		    if (nums[i] == nums[i-1]) return true;
        }
        return false;
    }
};

Hash Set - O(n) time - O(n) space

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_set<int> seen;
        for (int num : nums) {
            if (seen.count(num) > 0)
                return true;
            seen.insert(num);
        }
        return false;
    }
};

Hashmap - O(n) time - O(n) space

using namespace std;
 
class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
		unordered_map<int, int> counter;
        for (int i = 0; i < nums.size(); i++) {
            if(counter[nums[i]] != 1) counter[nums[i]] = 1;
            else return true;
        }
        return false;
    }
};

Improved version

class Solution {
public:
    bool containsDuplicate(vector<int>& nums) {
        unordered_map<int, int> counter;
        for (int num : nums) {
            if (counter[num] >= 1) return true;
            counter[num]++;
        }
        return false;
    }
};