• 【LeetCode】219. 存在重复元素 II


    219. 存在重复元素 II

    难度:简单

    题目

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

    示例 1:

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

    示例 2:

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

    示例 3:

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

    提示:

    • 1 <= nums.length <= 10^5
    • -10^9 <= nums[i] <= 10^9
    • 0 <= k <= 10^5

    个人题解

    思路:

    1. 哈希逐个判断即可
    class Solution {
        public boolean containsNearbyDuplicate(int[] nums, int k) {
            HashMap<Integer, Integer> map = new HashMap<>();
            for (int i = 0; i < nums.length; i++) {
                if (!map.containsKey(nums[i])) {
                    map.put(nums[i], i);
                } else if (Math.abs(i - map.get(nums[i])) <= k){
                    return true;
                }
                map.put(nums[i], i);
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    官方题解

    方法一:哈希表
    class Solution {
        public boolean containsNearbyDuplicate(int[] nums, int k) {
            Map<Integer, Integer> map = new HashMap<Integer, Integer>();
            int length = nums.length;
            for (int i = 0; i < length; i++) {
                int num = nums[i];
                if (map.containsKey(num) && i - map.get(num) <= k) {
                    return true;
                }
                map.put(num, i);
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    复杂度分析

    • 时间复杂度:O(n)
    • 空间复杂度:O(n)
    方法二:滑动窗口

    考虑数组 nums 中的每个长度不超过 k + 1的滑动窗口,同一个滑动窗口中的任意两个下标差的绝对值不超过 k 。如果存在一个滑动窗口,其中有重复元素,则存在两个不同的下标 i 和 j 满足 nums[i] == nums[j]abs(i - j) <= k 。如果所有滑动窗口中都没有重复元素,则不存在符合要求的下标。因此,只要遍历每个滑动窗口,判断滑动窗口中是否有重复元素即可。

    如果一个滑动窗口的结束下标是 i ,则该滑动窗口的开始下标是 max(0,i - k)。可以使用哈希集合存储滑动窗口中的元素。从左到右遍历数组 nums,当遍历到下标 i 时,具体操作如下:

    1. 如果 i > k,则下标 i - k - 1处的元素被移出滑动窗口,因此将 num[i-k-1] 从哈希集合中删除
    2. 判断 nums[i] 是否在哈希集合中,如果在哈希集合中则在同一个滑动窗口中有重复元素,返回 true,如果不在哈希集合中则将其加入哈希集合。

    当遍历结束时,如果所有滑动窗口中都没有重复元素,返回 false

    class Solution {
        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) {
                    set.remove(nums[i - k - 1]);
                }
                if (!set.add(nums[i])) {
                    return true;
                }
            }
            return false;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    复杂度分析

    • 时间复杂度:O(N)
    • 空间复杂度:O(k)

    作者:力扣官方题解
    链接:https://leetcode.cn/problems/contains-duplicate-ii/solutions/1218075/cun-zai-zhong-fu-yuan-su-ii-by-leetcode-kluvk/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【精讲】Es6的数组的扩展方法,对象的扩展方法,字符串扩展方法,?. 对象层级深
    采购管理软件:如何快速实现采购申请自动化流转?
    基于目标检测实现遥感场景下的车辆检测计数
    C语言入门(四):有关逻辑的运算符和表达式
    python使用seedir查看文件目录结构
    一表谈现实、系统、流程、报表与BI
    打造全身视角的医院可视化能源监测管理平台,实现医院能源可视化管理
    4.9 GHz异帧隔离间距研究
    golang的垃圾回收算法之十写屏障的技术
    nginx的重定向
  • 原文地址:https://blog.csdn.net/xxx1276063856/article/details/134342061