一、题目
给定整数数组 nums 和整数 k,判断是否存在两个不同下标 i、j,满足:
nums[i] == nums[j]abs(i - j) ≤ k满足条件返回true,否则返回false。
二.解法
心思想
使用 unordered_map哈希映射,建立映射关系:数组数值 → 该数值上一次出现的下标。 遍历流程:
- 遍历到下标
i,取出当前数字nums[i]; - 查询哈希表:
- 如果该数字曾经存在,计算当前下标与上次下标差值;差值 ≤ k,直接返回
true; - 如果不满足条件 / 数字从未出现,更新哈希表中该数字的下标为当前 i;
- 如果该数字曾经存在,计算当前下标与上次下标差值;差值 ≤ k,直接返回
关键:只保存最近一次出现的下标。如果旧下标距离超出 k,旧记录没有保留价值,直接覆盖。
#include<unordered_map>
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
int n=nums.size();
unordered_map<int,int> hash(n);
for(int i=0;i<n;i++)
{
if(hash.count(nums[i])&&i-hash[nums[i]]<=k)
return true;
hash[nums[i]]=i;
}
return false;
}
};

228

被折叠的 条评论
为什么被折叠?



