首先我们想到的肯定是模拟,对着整个数组一个个扣,扣到结尾就回到开头继续循环。
这个暴力的方法最后的时间复杂度就是O(k),数量级是很大的。
我们自然会想到,这里面其实有很多信息是可以重复利用的。
第一,如果我们记录下了sum(chalk),那么我们就能直接求余,省去很多次的遍历。
基于这个朴素的想法,我们思考一下优化的结果。:
1. 第一次遍历能被省去吗?不行,必须都访问了才能知道chalk的信息。
2. 能把后续的遍历都省去吗?也不行,最后的一次遍历不能省去,我们要算出哪里才是真正补充粉笔的地方。
于是我们最多只需要遍历两次chalk就能完成任务,时间复杂度降低到O(2n)。
第二,因为我们已经遍历过chalk了,自然能想到我们可以利用第一次遍历,记录下到第 i 个同学时,一共需要耗费多少粉笔。
我们第一个优化思路就已经记录下sum(chalk)了,而这一个优化思路就是为同学 i 记录下 sum(chalk[0..i])。
那这就是记录前缀和啊!记录完之后,我们就可以通过二分查找的方式去快速找到第几个同学需要补充粉笔了。
现在时间复杂度就降低到了O(n+logn)
代码就不贴了,自己去看官方题解吧