🌗 219. 存在重复元素 II

吞佛童子2022年10月10日
  • algorithm
  • Array
  • Hash
小于 1 分钟

🌗 219. 存在重复元素 II

难度: 🌗

问题描述

img_1.png


解法 1 - HashMap

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        // 思路:
        // 一次遍历 - map 存放 值 - 下标
        int len = nums.length;
        HashMap<Integer, Integer> map = new HashMap<>();
        for(int i = 0; i < len; i ++) {
            if(!map.containsKey(nums[i])) {
                map.put(nums[i], i);
            } else {
                int prev = map.get(nums[i]);
                if(i - prev <= k) {
                    return true;
                } else {
                    map.put(nums[i], i);
                }
            }
        }
        return false;
    }
}

输出 1

img.png


解法 2 - 滑动窗口 + HashSet

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        // 思路:
        // 滑动窗口,窗口大小为 k,只要窗口中存在 2 个相同元素,则说明满足条件
        // set 存放滑动窗口内的值
        if(k == 0) {
            return false;
        }
        int len = nums.length;
        if(len < 2) {
            return false;
        }
        HashSet<Integer> set = new HashSet<>();
        for(int i = 0; i < Math.min(len, k + 1); i ++) {
            if(set.contains(nums[i])) {
                return true;
            }
            set.add(nums[i]);
        }
        // 滑动
        for(int i = k + 1; i < len; i ++) {
            set.remove(nums[i - k - 1]);
            if(set.contains(nums[i])) {
                return true;
            } else {
                set.add(nums[i]);
            }
        }
        return false;
    }
}

输出 2

img_2.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou