LeetCode 219 存在重复元素 II

给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j]abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1,2,3,1,2,3], k = 2
输出:false
哈希表 和滑动窗口
  • 方法一

    /**
     * 哈希
     *
     * @param nums
     * @param k
     * @return
     */
    public static boolean containsNearbyDuplicate1(int[] nums, int k) {
        if (nums == null) {
            return false;
        }
    
        // 保存每个元素出现的位置
        Map<Integer, List<Integer>> integers = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int tmp = nums[i];
            // 当前元素如果重复出现,判断之前出现的下标位置是否和当前位置的距离超过k
            List<Integer> integerList = integers.getOrDefault(tmp, new ArrayList<>());
            for (int j = 0; j < integerList.size(); j++) {
                // 判断是否出现满足条件的元素
                if (i - integerList.get(j) <= k) {
                    return true;
                }
            }
            // 没有出现则需要将当前位置加入到当前元素的位置链表中
            integerList.add(i);
            integers.put(tmp, integerList);
        }
        return false;
    }
    
  • 方法二

    /**
     * 滑动窗口
     *
     * @param nums
     * @param k
     * @return
     */
    public static boolean containsNearbyDuplicate02(int[] nums, int k) {
        if (nums == null) {
            return false;
        }
    
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = i + 1; j < nums.length && j <= i + k; j++) {
                if (nums[i] == nums[j]) {
                    return true;
                }
            }
        }
        return false;
    }
    
  • 方法三

/**
 * 滑动窗口+ 哈希
 *
 * @param nums
 * @param k
 * @return
 */
public static boolean containsNearbyDuplicate(int[] nums, int k) {
    if (nums == null) {
        return false;
    }

    Set<Integer> integerSet = new HashSet<>();
    for (int i = 0; i < nums.length; i++) {
        if (i > k) {
            integerSet.remove(nums[i - k - 1]);
        }
        if (integerSet.contains(nums[i])) {
            return true;
        }
        integerSet.add(nums[i]);
    }
    return false;
}
测试用例
public static void main(String[] args) {
    int[] nums = new int[]{1, 2, 3, 1};
    int k = 3;
    boolean flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
    System.out.println("ContainsNearbyDuplicate demo01 result : " + flag);

    nums = new int[]{1, 0, 1, 1};
    k = 1;
    flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
    System.out.println("ContainsNearbyDuplicate demo02 result : " + flag);

    nums = new int[]{1, 2, 3, 1, 2, 3};
    k = 2;
    flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
    System.out.println("ContainsNearbyDuplicate demo03 result : " + flag);

    nums = new int[]{2, 2};
    k = 3;
    flag = ContainsNearbyDuplicate.containsNearbyDuplicate(nums, k);
    System.out.println("ContainsNearbyDuplicate demo04 result : " + flag);
}
测试结果
ContainsNearbyDuplicate demo01 result : true
ContainsNearbyDuplicate demo02 result : true
ContainsNearbyDuplicate demo03 result : false
ContainsNearbyDuplicate demo04 result : true
posted @ 2022-01-19 19:07  枫叶艾辰  阅读(26)  评论(0编辑  收藏  举报