给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
思路:hash
不同于[leetcode]217.存在重复元素本题由于要考虑从两个相同元素之间的距离,于是使用hash表存储对应元素最后一次出现的位置,如果下一次遍历到这个元素,则用当前的位置于hash表中的位置相减,若差值小于等于k,则返回true,否则更新位置。
AC代码:(C++)
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if (nums.size() == 0 || nums.size() == 1) {
return false;
}
unordered_map<int, int> mp; //<元素,上一次出现的下表>
int len = nums.size();
for (int i = 0; i < len; i++) {
if (mp.find(nums[i]) != mp.end()) {
//存在已经出现过的元素,判断距离
if ((i - mp[nums[i]]) <= k) {
return true;
} else {
mp[nums[i]] = i; //更新位置
}
} else {
mp[nums[i]] = i;
}
}
return false;
}
};