Level: Easy
(资料图)
仍然采用预处理 + 部分遍历的方式。首先遍历nums
数组中前k个元素,即位序[0, k]
,将其存入集合,若遍历过程中存在重复元素则直接返回True
。
然后遍历剩下的元素,直接判断当前元素是否在集合中,特别注意,由于预处理数组长度已经为 k + 1
,判断存在性时,相当于向预处理数组再插入一个元素,此时数组长度已经为k + 2
, 因此需要在判断前,删除数组左端点的元素。
时间复杂度:O(N)
。此处的 n 指的是数组 nums
长度。
空间复杂度:O(K)
。 自始至终维护一个大小为 k
的集合。
此题求存在性,若数组中元素各不相同,则一定没有满足要求的位序对;
前 k + 1长度数组,其遍历中的元素添加与成员判断,可以合并到一次遍历中;
做题时,未充分考虑此题的特殊性,首先题目看似是一个不定长数组,但实际上仍然可以用滑窗,只需要保证最坏情况成立,即可保证成立
有两点是没有考虑到的:
遍历前 k + 1
个元素,仍然可能遇到相同的元素
修改弹窗时,不应该按照传统的左边出队,右边入队的思路,还需要考虑此时数组长度,显然此题判断时,数组长度已经为 k + 1
, 不满足判断的元素之相对位置小于等于k
的要求,因此需要先删除左端点对应的元素后判断。
做题应当首先考虑数据特性,选择合适的数据类型,本题中选择列表和集合无本质区别,至少是可变数据类型,因为本题会涉及到插入删除,因为之所以用集合会出错,是因为没有处理同值下标。
查看复杂度排名时,发现边界条件没有考虑到,将数组转换为集合,集合的容积如果与原数组相等则说明整个数组无重复元素,直接可以判定为错误
难点:以滑动窗口长度为 k + 1
,举例,此时删除的元素应该是 nums[i - k - 1]
,因为题目限制的滑动窗口不是数组长度,而是位序长度,两者差值为1。
关键词: