
楔子
大家好,我是张桃狮。
最近我的电脑C盘剩余空间只有20多GB了,心中莫名焦虑起来。
我打开WizTree,查看都有哪些文件夹占用大量空间。
结果发现,那些能够叫得出名字的大文件夹都被我清理得差不多了,比如钉钉缓存之类的。
还有一些我叫不出名字的大文件夹,我也不敢随意删除,怕电脑报错。
这该怎么办呢?
要不装一下国内大厂出的电脑管家、电脑卫士?想想我就很头疼,因为这些软件本身就很流氓,各个“ 身怀绝技”。
我忽然想到微软官方曾经出过一个电脑管家,不知道好不好用。
我在Bing中搜索微软电脑管家,得到的都是Microsoft Store的链接,这个Microsoft Store在国内很难直接打开。
还好我在华军软件园找到了微软电脑管家绿色版。
安装的时候要点一个批处理命令,我第一次安装的时候失败了,使用管理员权限才安装成功。
安装好后,在\Microsoft.MicrosoftPCManager\files文件夹中可以找到一个叫微软电脑管家的快捷方式,双击就可以打开了。
点击电脑管家-存储-深度清理,可以看到很多可以清理的选项,不但包括第三方软件,也可以清理Windows系统垃圾。
这点是我最看好的,因为Windows系统文件夹的文件,我是真的不敢随便删除。
全部清理完后,我的电脑C盘剩余空间竟然达到50GB左右,这下我的C盘剩余空间不足焦虑症彻底好了。

注意,微软电脑管家最低系统版本要求Windows10 20H2,也就是19042。
如果点安装.bat没有任何反应,可能是上级和上上级目录名加起来太长了。如果当前路径包含空格或者括号,请重命名后再运行。
那么微软电脑管家和国内大厂出的电脑管家有什么不同呢?可能就是不会随便下崽和修改浏览器首页吧。
闲话讲完,咱们继续力扣刷题学编程。
力扣495. 提莫攻击
在《英雄联盟》的世界中,有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希(编者注:寒冰射手)进入中毒状态。
当提莫攻击艾希,艾希的中毒状态正好持续 duration 秒。
正式地讲,提莫在 t 发起攻击意味着艾希在时间区间 [t, t + duration - 1](含 t 和 t + duration - 1)处于中毒状态。如果提莫在中毒影响结束 前 再次攻击,中毒状态计时器将会 重置 ,在新的攻击之后,中毒影响将会在 duration 秒后结束。
给你一个 非递减 的整数数组 timeSeries ,其中 timeSeries[i] 表示提莫在 timeSeries[i] 秒时对艾希发起攻击,以及一个表示中毒持续时间的整数 duration 。
返回艾希处于中毒状态的 总 秒数。
示例 1:
输入:timeSeries = [1,4], duration = 2输出:4解释:提莫攻击对艾希的影响如下:
• 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。 • 第 4 秒,提莫再次攻击艾希,艾希中毒状态又持续 2 秒,即第 4 秒和第 5 秒。艾希在第 1、2、4、5 秒处于中毒状态,所以总中毒秒数是 4 。示例 2:
输入:timeSeries = [1,2], duration = 2输出:3解释:提莫攻击对艾希的影响如下:
• 第 1 秒,提莫攻击艾希并使其立即中毒。中毒状态会维持 2 秒,即第 1 秒和第 2 秒。 • 第 2 秒,提莫再次攻击艾希,并重置中毒计时器,艾希中毒状态需要持续 2 秒,即第 2 秒和第 3 秒。艾希在第 1、2、3 秒处于中毒状态,所以总中毒秒数是 3 。
提示:
1 <= timeSeries.length <= 0 <= timeSeries[i], duration <= timeSeries 按 非递减 顺序排列
我的思路
新建一个集合,将所有中毒时间都加进去,集合会自动去重,最后返回集合的长度。
class Solution: def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int: res=set() for i in timeSeries: for j in range(i,i+duration): res.add(j) return len(res)提交后,发现超过时间限制了。
我发现超时的timeSeries数据茫茫多,每次中毒时间duration=100000,这样艾希还不会死吗?
要避免超时,必须将时间复杂度降下来。
我的代码时间复杂度是,要是能降到O(n)就好了。
一次遍历就得出结果。
我想到一个方法,先把timeSeries的长度记录下来,然后累加每次的中毒时间。
如果中毒时间没有重叠,就+duration-1。
如果中毒时间重叠,就+duration-1后,再把重叠部分减去。
class Solution: def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int: res=len(timeSeries) j=0 for i , t in enumerate(timeSeries[:-1]): if (t+duration-1-timeSeries[i+1])<0: j=0 else: j=t+duration-1-timeSeries[i+1]+1 res = res+duration-1-j res += duration-1 return res力扣提交通过,时间复杂度O(n),空间复杂度O(n)。
为了避免下标越界,我使用了切片[:-1],切片会占用额外的内存O(n)。
我懒得优化了,直接看官方题解吧。
力扣官方题解
方法一:单次扫描
class Solution: def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int: ans, expired = 0, 0 for i in range(len(timeSeries)): if timeSeries[i] >= expired: ans += duration else: ans += timeSeries[i] + duration - expired expired = timeSeries[i] + duration return ans力扣提交通过,时间复杂度O(n),空间复杂度O(1)。
expired:上一次中毒结束时刻(毒失效的时间点)。
这个方法很不错,和我的列表元素两两比较大法比起来,简洁了许多。
评论区还有更简洁的代码。
力扣网友Subway的代码
class Solution: def findPoisonedDuration(self, timeSeries: List[int], duration: int) -> int: cnt=0 for i in range(1,len(timeSeries)): cnt+=min(duration,timeSeries[i]-timeSeries[i-1]) return cnt+duration力扣提交通过,时间复杂度O(n),空间复杂度O(1)。
思路跟我的基本一样,但是对代码做了优化,我喜欢。
我是个编程爱好者,小白级别的,如果你跟我一样希望通过力扣刷题,学习各种奇妙的算法,可以关注我,大家一起学习。
夜雨聆风