问题描述:
给定一个整数数组和一个整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
原文题目描述有些问题:i 和 j 的绝对差值不能大于k,即必须小于等于k
执行结果:
代码描述:
思路:把nums中的数据,挨个放入map中,且map<键, 值>,其中键对应nums的值,值对应nums的索引。当map中不存在该数字时,insert进去,且记录索引,再次插入相同数据,对两次索引进行求查,判断是小于k, 不小于的话,一定要用第二次的数字,替换第一次的数字对应的值,为了更好的匹配下一个值的索引,参考例2 的后两个1。
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
if(nums.size() == 0 || nums.size() == 1)
{
k = -1;
return false;
}
map<int, int> m;// key, index
for(int i = 0; i < nums.size(); ++i)
{
if(m.count(nums[i]) > 0)
{
if(k >= (i - m[nums[i]]))
return true;
else
m[nums[i]] = i; // 不满足的话,重新插入,替换原来的索引
}
else
m[nums[i]] = i;
}
return false;
}
};