Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
leetcode刷题219存在重复元素2
前文
本文为leetcode数组类型题目,题目序号219,主要靠查对于数组中查找的快速方法。
题目信息
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
解题思路
根据题目信息本身而言,本题目主要是考查对于给定的目标数组,是否存在其中距离小于k的两个元素值。很明显的一种思路是做双重循环,在对于内部的循环中,每次采用距离为k的元素循环,并在其中判断是否存在目标的两个相同元素即可。但显然该方法的时间复杂度不太友好,达到n^2。因此本解题方法采用滑动窗口的思路,以k作为窗口滑动长度,并利用set进行存储。如果其中出现了相同的元素,则认为存在。每次滑动过程中都将窗口末尾的元素移除。按此思路即可利用时间复杂度n完成本题目的要求。滑动窗口同样是一种常用的效率优化手段,能显著降低时间复杂度。
解题代码
public boolean containsNearbyDuplicate(int[] nums, int k) {
Set<Integer> set = new HashSet<Integer>();
int length = nums.length;
for (int i = 0; i < length; i++) {
if (i > k) {
int pos = i - k - 1;
set.remove(nums[pos]);
}
if (set.contains(nums[i])) {
return true;
}
}
return false;
}
后记
- 千古兴亡多少事?悠悠。不尽长江滚滚流。