栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode 219: 存在重复元素 IIContains Duplicate II

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 219: 存在重复元素 IIContains Duplicate II

题目:

​ 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 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 set=new HashSet<>();
 for(int i=0;ik) 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])
转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号