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)

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

  • 相关阅读:
    吴裕雄 19-Mysql 连接的使用
    吴裕雄 18-MySQL GROUP BY 语句
    吴裕雄 17-MySQL 排序
    吴裕雄 16-MySQL UNION 操作符
    吴裕雄 15-MySQL LIKE 子句
    吴裕雄 14-MySQL DELETE 语句
    吴裕雄 13-MySQL UPDATE 查询
    【2017中国大学生程序设计竞赛
    【2017中国大学生程序设计竞赛
    【AtCoder Regular Contest 082 F】Sandglass
  • 原文地址:https://www.cnblogs.com/KakagouLT/p/15253342.html
Copyright © 2011-2022 走看看