如何减少铲斗装填程序的时间复杂度?

时间:2015-10-27 05:32:15

标签: java c++ algorithm

我正在解决以下问题:

连续有n个桶。一个园丁给水桶浇水。他每天都在位置 i j (包括)之间挖掘水桶。他为不同的 i j t 天做了这个。

假设最初零体积,输出水桶中的水量,每次浇水使体积增加1

输入:第一行包含空格分隔的 t n 。 下一个 t 行包含 i j 以空格分隔。

输出:一行显示空格分隔的 n 存储桶中的音量。

实施例

输入:

2 2
1 1
1 2

输出:

2 1

约束:

0 <= t <= 10 4 ; 1&lt; = n&lt; = 10 5

我试过这个问题。但我使用O(n * t)算法。每次在每一步时,我都会将桶从i增加到j。但是这显示了时间限制错误。有没有有效的算法来解决这个问题。一个小提示就足够了。

P.S:我使用C ++和Java作为标签bcoz程序可以用两种语言编程。

4 个答案:

答案 0 :(得分:4)

不要记住每个水桶中的水量,而应记住每个水桶与前一个水桶之间的差异。

答案 1 :(得分:1)

有两个间隔列表,一个按上限排序,一个按下限

然后从卷0开始迭代n。

On each iteration over n
  check if the next interval starts at n
    if so increase v by one and check the next interval.
  do the same for the upper bounds but decrease the volume
  print v
repeat with the next n

答案 2 :(得分:1)

我认为这里的关键观察是你需要找出一种方法来表示你的(可能的)10个 5 桶而不实际为每个桶分配空间,并分别跟踪它们。你需要提出一个稀疏表示来跟踪你的桶和里面的水。

您的输入来自范围的事实为您提供了一个很好的提示:您应该在稀疏表示中使用范围。您只需跟踪每个范围两端的存储桶即可实现此目的。

我建议您使用链接列表执行此操作。每个列表节点将包含2条信息:

  1. 一个桶号
  2. 该桶中的水量
  3. 您认为当前水桶和下一个水桶之间的所有水桶都有相同的水量。

    以下是一个例子:

    Input:
    5 30
    1 5
    4 20
    7 13
    25 30
    19 27
    

    这是算法的每一步会发生什么,第一步是初始状态,每一个连续步骤都是解析一条线后的步骤。

    1. 1:0 NULL(所有桶都为0)
    2. 1:1 6:0 NULL(1-5有1,其余为0)
    3. 1:1 4:2 6:1 21:0 →{{1 (1-3有1,4,5有2,6-20有1,其余有0)
    4. 1:1 4:2 6:1 7:2 14:1 21:0 NULL
    5. 1:1 4:2 6:1 7:2 14:1 21:0 25:1 NULL
    6. 1:1 4:2 6:1 7:2 14:1 19:2 21:1 25:2 28:1 NULL
    7. 你应该能够从上面的例子中推断出这种方法的复杂性实际上是 O(t 2 而不是 O(n×t ),所以这应该更多更快。正如我在上面的评论中所说,这种方式的瓶颈实际上应该是解析和输出,而不是实际的计算。

答案 3 :(得分:-1)

这是一个具有空间和时间复杂度O(n)

的算法

我正在使用java,因为我习惯了它

1)创建n个元素的哈希集 2)每次浇水时,增加各自的元素数量 3)文件解析完成后,迭代hashset计算结果。