给定一个整数数组和一个整数k,判断数组中是否存在两个不同的索引i和j,使得nums [i] = nums [j],并且i和j的差的绝对值至多为k。
方法一:
建立一个哈希表,索引为已经遍历的数字,值为数字在数组中的序列号。
class Solution {
public:
bool containsNearbyDuplicate(const vector<int>& nums, const int& k) {
unordered_map<int, size_t> num_index_map;
for (size_t i = 0; i < nums.size(); i++) {
int cur_num = nums[i];
if (num_index_map.count(cur_num)) {
int j = num_index_map[cur_num];
if (i - j <= k) {
return true;
}
}
num_index_map[cur_num] = i;
}
return false;
}
};
时间复杂度为O(n),空间复杂度为O(n)。
方法二:
建立并维护一个长度为k的哈希表,存储已经遍历过数组中的元素。
class Solution {
public:
bool containsNearbyDuplicate(const vector<int>& nums, const int& k) {
unordered_set<int> visited_nums;
for (size_t i = 0; i < nums.size(); i++) {
int cur_num = nums[i];
if (visited_nums.count(cur_num)) {
return true;
}
visited_nums.insert(cur_num);
if (visited_nums.size() > k) {
int old_num = nums[i - k];
visited_nums.erase(old_num);
}
}
return false;
}
时间复杂度为O(n),空间复杂度为O(k)。