今天继续给大家分享一道力扣的做题心得今天这道题目是
- 存在重复元素 II,我使用 hashmap 的方法来解题
题目如下,题目链接:219. 存在重复元素 II
1,题目分析
此题目给我们了一个整数数组 nums
和一个整数 k
,需要我们判断数组中是否存在两个 不同的索引 i
和j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
题目不难理解下面是题目需要理解的要点:
要点:满足有一个重复的值并且这两个值的对应的在数组中的索引之差的绝对值要小于一个所给定的值k ,即可判断为为true返回true就行
2,解题思路
我本来是使用双重for循环,结果不出意外的超时了只能使用map来解决
下面是我的题解:
java
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap<>();
for(int i = 0;i < nums.length;i++){
if(map.containsKey(nums[i]) && ( (i - map.get(nums[i]) ) <= k ) ){
return true;
}
map.put(nums[i],i);
}
return false;
}
}
使用哈希表存储元素及其索引:
- 创建一个
HashMap
,键是数组中的元素,值是该元素在数组中的索引。 - 这种方法可以快速查找数组中某个元素的索引,时间复杂度为 O(1)。
遍历数组:
- 使用一个循环遍历数组
nums
,对于每个元素nums[i]
:- 首先检查哈希表中是否已经存在该元素(即
map.containsKey(nums[i])
)。 - 如果存在,获取该元素在哈希表中存储的索引
map.get(nums[i])
。 - 计算当前索引
i
和哈希表中存储的索引之差i - map.get(nums[i])
。 - 如果这个差值小于等于
k
,则说明找到了两个相同的元素,且它们的索引之差不超过k
,返回true
。
- 首先检查哈希表中是否已经存在该元素(即
更新哈希表:
- 如果当前元素没有在哈希表中找到,或者找到的索引差值大于
k
,则将当前元素及其索引i
存储到哈希表中。 - 这样可以确保在后续的遍历中,如果再次遇到相同的元素,可以快速找到其之前的索引并进行比较。
返回结果:
- 如果遍历完整个数组都没有找到满足条件的元素对,则返回
false
。
解题代码细节分析
map.containsKey(nums[i])
:检查当前元素是否已经在哈希表中存在。map.get(nums[i])
:获取当前元素在哈希表中存储的索引。
i - map.get(nums[i]) <= k
:判断当前索引与之前存储的索引之差是否小于等于 k
。map.put(nums[i], i)
:将当前元素及其索引存储到哈希表中
3,总结
感谢大家的阅读,希望这篇解题心得能为大家带来一些收获,我们共同进步!大家的点赞就是我的动力谢谢大家,还有什么更优解或者问题欢迎大家在评论区讨论分享!