Contains Duplicate II - Hashset
Problem Statement:
Given an integer array nums and an integer k, return true if there are two distinct indices i and j in the array such that nums[i] == nums[j] and abs(i - j) <= k.
Example 1:
Input: nums = [1,2,3,1], k = 3 Output: true
Example 2:
Input: nums = [1,0,1,1], k = 1 Output: true
Example 3:
Input: nums = [1,2,3,1,2,3], k = 2 Output: false
Constraints:
1 <= nums.length <= 105-109 <= nums[i] <= 1090 <= k <= 105
Solution:
The idea is to find if we have seen the current value already in the range. Since the search operation in hashset is constant time, hence our algorithm is efficient.
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k)
{
int n=nums.size();
unordered_set<int> numset;
for (int i=0; i<k && i<n; ++i)
{
if (numset.count(nums[i])) return true;
numset.insert(nums[i]);
}
for (int i=k; i<n; ++i)
{
if (numset.count(nums[i])) return true;
numset.insert(nums[i]);
numset.erase(nums[i-k]);
}
return false;
}
};
TC: O(n)
SC: O(k)