题目描述
给定一个整数数组 nums 和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j 使得 nums[i] = nums[j] 且 i!= j。也就是说,不能有重复的元素。
示例
示例 1:
bash
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
bash
输入: nums = [1,2,3,1,2,4], k = 3
输出: false
示例 3:
bash
输入: nums = [1,2,3,1,2,4], k = 2
输出: true
题解
这个问题可以通过使用哈希表来解决。
- 初始化:创建一个空的哈希表 hashMap 来存储数组元素及其索引。
- 遍历数组:遍历整数数组 nums。
○ 对于每个元素,检查它是否已经在哈希表中:
■ 如果在,并且索引差小于 k,则返回 true。
■ 如果在,并且索引差大于等于 k,则从哈希表中移除旧的索引。
■ 如果不在,将其添加到哈希表中,并记录当前索引。 - 返回结果:如果遍历结束后没有找到重复元素,则返回 false。
代码实现
cpp
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> hashMap;
for (int i = 0; i < nums.size(); ++i) {
if (hashMap.find(nums[i]) != hashMap.end() && i - hashMap[nums[i]] <= k) {
return true;
}
hashMap[nums[i]] = i;
}
return false;
}
复杂度分析
● 时间复杂度:O(n),其中 n 是数组 nums 的长度。我们需要遍历一次数组,并且对于每个元素,我们进行常数时间的哈希表操作。
● 空间复杂度:O(n),因为在最坏的情况下,我们可能需要将所有元素存储在哈希表中。
这个算法的优势在于它的时间效率较高,只需要一次遍历即可判断是否存在重复元素,且直接利用了哈希表的快速查找特性。