219. Contains Duplicate II
Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most 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
Solution
Brute Force
超时
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int n = nums.size();
if(k >= n) k = n - 1;
for(int j = 1; j <= k ; j++)
for(int i = 0; i < nums.size() - j; i++){
if(nums[i] == nums[i+j]) return true;
}
return false;
}
};
Hash Table
Runtime: 68 ms, faster than 26.89% of C++ online submissions for Contains Duplicate II.
Memory Usage: 16.3 MB, less than 23.53% of C++ online submissions for Contains Duplicate II.
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> map;
if(k >= nums.size()) k = nums.size() - 1;
for(int i = 0; i < nums.size(); i++){
if(map.find(nums[i])!=map.end()) {
if(i - map[nums[i]] <= k)
return true;
}
map[nums[i]] = i;
}
return false;
}
};