我在做一个项目时遇到了这个问题,并且想知道解决这个问题的最佳方法:
假设我有以下带有分数的区间,我想在任何时刻找到区间内的最大分数:
3-8 20
4-10 40
8-12 10
9-13 20
结果应该是 40+10+20 = 70
3-8 和 4-10 在 4-8 处重叠,总“分数”为 40+20 = 60 4-10、8-12、9-13,全部在 9-10 重叠,得分为 40+10+20 = 70
显然我们还有其他重叠,例如每个间隔本身, 或 8-12 和 9-13(不包括 4-10),但这些不会产生最大值。 理想情况下,我也希望返回产生最大金额的重叠, 在本例中为 9-10 间隔, 它对应于所有 3 个产生最大分数的区间共享的区间。
解决这个问题的好算法是什么?
我最初的想法是按起点排序,然后检查之前的间隔是否重叠(这很容易),我很快遇到的问题是我们有以下情况:
3-9 20
4-10 40
8-12 10
9-13 30
当我们迭代时,我们认为 3-9 与 4-10 重叠,得到 60,然后 3-9、4-10 和 8-12 在 8-9 处重叠,得到 70。然而,当我们找到 9-13 时,我们需要以某种方式停止考虑 3-9,现在看看 4-10、8-12、9-13 重叠,给出 80,并在 9-10 处重叠。是否可以做一个滑动窗口?
将起点与正分数关联起来,将终点与负分数关联起来。将所有点排序在一起,并跟踪当前和最大累积和以及与最大和相关的开始/结束。