大公鸡
菜鸡入门
看到题目子数组的长度为k,马上想到滑动窗口,想到就干!
代码如上,关于滑动窗口的解释:
思路2:字典计数
其实,这题可以更快!
咯咯咯!
咯咯咯!
咯咯咯!
做题了哥哥!
思路1:集合暴力解
为了解决一个数组的长度为k的子数组的相关问题(优化时间复杂度),我们假设了一个可滑动的窗口(滑动用指针实现),窗口长度不变,在数组中以1为单位滑动每次滑动,最左边窗口包含的“数”被“减”去,最右边窗口的右边一位包含的数被“加”上,从而实现了O(n)时间复杂度的数组的遍历
但是,即使用滑动窗口,上解还是会超时,原因在于set(),为了实现题目要求“子数组中的所有元素各不相同”,我在更新最大值的时候,增设了一个条件:将子数组转化为集合后的长度==k:
if len(set(nums[ele - k + 1: ele + 1])) >= k:
这相当于每次遍历都创建了一个集合,当数据量大起来,耗时又耗力,这,是不行滴!
优化!
咯咯咯!
咯咯咯!
咯咯咯!
针对源头集合,我们换一个方法,那么,该怎么做呢?
没错,答案就是字典计数,也就是说,这题是“两数之和优化版 + 滑动窗口”,简单说,就是在遍历列表的时候,每次加减数的时候 ,用字典计数(出窗减,进窗加),同时,利用字典的key互异,”子数组中的所有元素各不相同”的判断条件为:
if len(ji_shu) == k:
这样,我们不必再每次遍历都创建一个集合,同时,查表的速度非常快!
结果如下:
怎么做呢?
交给你了,做题侠!
咯咯咯!
咯咯咯!
简单题!
大家一起来!
- 下载图片
- 复制图片
2024-10-28
浏览413
技能问答
登录后评论
1
评论
分享