题型:哈希表、数组
链接:219. 存在重复元素 II - 力扣(LeetCode)
来源:LeetCode
题目描述
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
题目样例
示例 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
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
题目思路
不看提示的话(不考虑数组元素个数)可以直接暴力(双指针 遍历数组),元素一多就炸
考虑时间复杂度的话,可以用哈希表。因为要看重复元素的出现次数,要看两个int元素,那可以用unordered_map来存,key是 nums[i],value是 i 。用 i 来遍历数组,hash[nums[i]] == i 时,说明数组中这个元素出现过,这时候再看一下差,满足条件就可以return 1了,不满足就继续循环,差值不够就更新哈希表对应key的value
C++代码
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
// 哈希表
// 遍历数组,如果当前元素和哈希表中的元素相同(说明重复了),看i-hash[nums[i]]
unordered_map<int,int> temp_hash;//key nums[i] value i
int i=0,len=nums.size();
for(;i<len;i++)
{
if(temp_hash.count(nums[i]) && i-temp_hash[nums[i]]<=k)
return 1;
else
temp_hash[nums[i]] = i;
}
return 0;
}
};