首页 > 聚焦 > 正文

219. 存在重复元素 II_今日热文

2023-04-26 21:02:40   来源:哔哩哔哩  

219. 存在重复元素 II

Level: Easy


(资料图)

方法一:滑动窗口

仍然采用预处理 + 部分遍历的方式。首先遍历nums数组中前k个元素,即位序[0, k],将其存入集合,若遍历过程中存在重复元素则直接返回True

然后遍历剩下的元素,直接判断当前元素是否在集合中,特别注意,由于预处理数组长度已经为 k + 1,判断存在性时,相当于向预处理数组再插入一个元素,此时数组长度已经为k + 2, 因此需要在判断前,删除数组左端点的元素。

Python版本

C++版本

复杂度分析

时间复杂度:O(N)。此处的 n 指的是数组 nums长度。

空间复杂度:O(K)。 自始至终维护一个大小为 k的集合。

方法一优化:遍历合并+边界检查

此题求存在性,若数组中元素各不相同,则一定没有满足要求的位序对;

前 k + 1长度数组,其遍历中的元素添加与成员判断,可以合并到一次遍历中;

Python版本

C++版本

备注

做题时,未充分考虑此题的特殊性,首先题目看似是一个不定长数组,但实际上仍然可以用滑窗,只需要保证最坏情况成立,即可保证成立

有两点是没有考虑到的:

遍历前 k + 1个元素,仍然可能遇到相同的元素

修改弹窗时,不应该按照传统的左边出队,右边入队的思路,还需要考虑此时数组长度,显然此题判断时,数组长度已经为 k + 1, 不满足判断的元素之相对位置小于等于k的要求,因此需要先删除左端点对应的元素后判断。

做题应当首先考虑数据特性,选择合适的数据类型,本题中选择列表和集合无本质区别,至少是可变数据类型,因为本题会涉及到插入删除,因为之所以用集合会出错,是因为没有处理同值下标。

查看复杂度排名时,发现边界条件没有考虑到,将数组转换为集合,集合的容积如果与原数组相等则说明整个数组无重复元素,直接可以判定为错误

难点:以滑动窗口长度为 k + 1,举例,此时删除的元素应该是 nums[i - k - 1],因为题目限制的滑动窗口不是数组长度,而是位序长度,两者差值为1。

关键词:

推荐内容

Copyright www.caikuang.1s.cn 版权所有
网站备案号:京ICP备2021034106号-22
邮箱:55 16 53 8@qq.com