219. 存在重复元素II


滑动窗口

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {

        /**
         * 滑动窗口
         * i为左指针,right为右指针,当区间长度小于k时且不满足条件,right右移
         * 当长度为k还不满足条件,i右移,同时right从i + 1开始
         */
        for (int i = 0; i < nums.length; i++) {

            int right = i + 1;

            while (right - i <= k && right < nums.length){

                if (nums[i] == nums[right]){
                    return true;
                }
                else {
                    right++;
                }
            }
        }

        return false;
    }
}

/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

优化1——使用集合存储元素,避免重复判断

import java.util.HashSet;

class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {

        /**
         * 滑动窗口
         * i为左指针,right为右指针,当区间长度小于k时且不满足条件,right右移
         * 当长度为k还不满足条件,i右移,同时right从i + 1开始
         * 用set存储元素,当在k的范围内出现重复元素时返回true,否则删除存储的第一个元素
         */
        HashSet 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;
    }
}


/**
 * 时间复杂度 O(n)
 * 空间复杂度 O(1)
 */

https://leetcode-cn.com/problems/contains-duplicate-ii/