219:存在重复元素II

问题描述

给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。

示例

输入: nums = [1,2,3,1], k = 3
输出: true
输入: nums = [1,0,1,1], k = 1
输出: true
输入: nums = [1,2,3,1,2,3], k = 2
输出: false

分析

这个坑题。我一开始是以为重复元素最多只有2个。(我TM哪来的神推断,可能是因为我看了示例1就开干了)。然后又以为是等于k,事实证明了带眼睛做题的重要性。
好了,言归正传。
我是这么做的:维持了一个HashMap。 以nums[i]key,以ivalue
对于nums[i],如果HashMap中没有,就把它加进去,有就判定他们两个的距离,如果小于等于k,皆大欢喜,return true. 如果大于k,证明这俩不合适,直接把前面的k-v给替换成当前最新的kv。(方法一)
还有种办法是维护了一个长度为k+1的滑动窗口。利用HashSet维护的。如果这个k+1长度的HashSet都没有重复元素,证明是没有符合条件的了,往右滑动即可。(方法二)

方法一

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])){
                if(i-map.get(nums[i]) <= k){
                    return true;
                }else if(i-map.get(nums[i]) > k){
                    map.replace(nums[i],i);
                }
            }else{
                map.put(nums[i],i);
            }
        }
        return false;
    }
}

方法二

Java版

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < nums.length; ++i) {
            if (set.contains(nums[i])) return true;
            set.add(nums[i]);
            if (set.size() > k) {
                set.remove(nums[i - k]);
            }
        }
        return false;
    }
}
发布了396 篇原创文章 · 获赞 22 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_41687289/article/details/104811741