zoukankan      html  css  js  c++  java
  • Leetcode 1894

    首先我们想到的肯定是模拟,对着整个数组一个个扣,扣到结尾就回到开头继续循环。

    这个暴力的方法最后的时间复杂度就是O(k),数量级是很大的。

    我们自然会想到,这里面其实有很多信息是可以重复利用的。

    第一,如果我们记录下了sum(chalk),那么我们就能直接求余,省去很多次的遍历。

    基于这个朴素的想法,我们思考一下优化的结果。:

    1. 第一次遍历能被省去吗?不行,必须都访问了才能知道chalk的信息。

    2. 能把后续的遍历都省去吗?也不行,最后的一次遍历不能省去,我们要算出哪里才是真正补充粉笔的地方。

    于是我们最多只需要遍历两次chalk就能完成任务,时间复杂度降低到O(2n)。

    第二,因为我们已经遍历过chalk了,自然能想到我们可以利用第一次遍历,记录下到第 i 个同学时,一共需要耗费多少粉笔。

    我们第一个优化思路就已经记录下sum(chalk)了,而这一个优化思路就是为同学 i 记录下 sum(chalk[0..i])。

    那这就是记录前缀和啊!记录完之后,我们就可以通过二分查找的方式去快速找到第几个同学需要补充粉笔了。

    现在时间复杂度就降低到了O(n+logn)

    代码就不贴了,自己去看官方题解吧

  • 相关阅读:
    9.3 simulated match
    网络流模版大全
    Treblecross
    ENimEN
    求逆序对的两种方法(树状数组/归并排序)
    树状数组
    计算最短路和次短路条数
    Python3.7版库的安装以及常用方法(十分简单)
    二维线段树(hdu1823)
    流星雨(记忆化搜索)
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/15253342.html
Copyright © 2011-2022 走看看