题目描述
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false
题目链接
问题解决
答案思路不难, 只要实现一个hashmap, 将这个值对应的下标保存在数组中就可以, 然后对数组进行abs(i - j) <= k
的判断即可
代码实现:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int x) {
unordered_map<int, vector<int>> map;
int n = nums.size();
for(int i = 0; i < n; i++)
{
map[nums[i]].push_back(i);
if(map[nums[i]].size() >= 2)
{
for(int j = 0; j < map[nums[i]].size(); j++)
{
for(int k = j + 1; k < map[nums[i]].size(); k++)
{
if(abs(map[nums[i]][j] - map[nums[i]][k]) <= x)
{
return true;
}
}
}
}
}
return false;
}
};
思路优化
代码的主要时间复杂度是在对这个数组进行的abs(i - j) <= k
判断, 为O(N2) 所以要进行优化主要从这里出发. 因为题目中说是<=k, 且我们对这个数组的存放值是按照对应数组的顺序进行存放, 所以i与j的相邻只需要判断即可代表<=的所有数
代码实现:
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> map;
int n = nums.size();
for(int i = 0; i < n; i++)
{
if(map.count(nums[i]))
{
if(i - map[nums[i]] <= k)
{
return true;
}
}
map[nums[i]] = i;
}
return false;
}
};