• LeetCode 219: 存在重复元素 II Contains Duplicate II


    题目:

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

    ​ Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolute difference between i and j is at most k.

    示例 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
    

    解题思路:

    ​ 遍历数组, 维护一个大小为 K 的滑动窗口, 该窗口遍历到的第 i 个元素, 后 K 个元素组成的数组 nums[ i, i + K] ,查找该数组内是否有与 nums[i] 相等的元素

    ​ 可以优化的地方只有维护的滑动窗口这一部分, 降低在这个动态数组中查找操作的时间复杂度

    优化一个数组内的查找时间复杂度的方法非常多:

    • 暴力破解: 直接操作指针将正在遍历的元素与其之后 K 个元素的节对比
    • 平衡二叉树: 构建一个平衡二叉树维护这个滑动窗口
    • 哈希集合: 维护一个长度为 K 的哈希集合,查找复杂度为 O(1)

    秦策只有用哈希集合维护滑动窗口才不会超时

    HashSet解题:

    Java:

    class Solution {
        public boolean containsNearbyDuplicate(int[] nums, int k) {
            HashSet<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;
        }
    }
    

    Python:

    class Solution:
        def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
            hash_set = set()
            for i, num in enumerate(nums):
                if num in hash_set: return True
                hash_set.add(num)
                if (len(hash_set) > k): hash_set.remove(nums[i - k])
    

    欢迎关注微..信.公.众..号: 爱写Bug
    爱写Bug.png

  • 相关阅读:
    用代码操作文件(文件夹)
    文件上传
    用ajax、PHP、session做购物车
    ajax返回数据类型为JSON数据的处理
    Hadoop机架感知
    Linux 克隆虚拟机以及克隆之后引起的“Device eth0 does not seem to be present, delaying initialization”问题解决
    克隆之后一键修改IP、删除Mac地址、修改主机名(未测试成功只是思路)
    关于Hadoop的杂乱无章(续更)
    使用CentOS6.8搭建Hadoop集群
    CentOS6.8卸载与安装yum
  • 原文地址:https://www.cnblogs.com/zhangzhe532/p/11860995.html
Copyright © 2020-2023  润新知