春招打卡d12n19-leetcode刷题219存在重复元素2

112 阅读1分钟

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;
}

后记

  • 千古兴亡多少事?悠悠。不尽长江滚滚流。