【发布时间】:2013-12-19 02:55:48
【问题描述】:
我有一个时间限制相当有限的问题,我想看看我是否可以在正确的方向上获得帮助。
问题来了:
您会看到一堵墙,里面有不同高度的柱子。每一列的高度都表示为一个非零整数。
输入状态是使用长度为
N的数组H定义的,包含每个高度 屏幕上的N列,例如:在给定高度对快照进行切片会留下许多实心碎片 高于那个高度。例如。在第 2 级切片将切出 3 个实心块:
在第 1 层切片也会切出 3 个实心块:
类似地,在 0 级切片会返回一个(一个)实心片,而在 3 级切片不会切割任何片。
要求:给定一个长度为
M的切片高度数组S,包含所有 应该执行“切片”的级别,返回一个长度为M的数组,其中包含每个切割的切割片数。例如,给定输入
H = {2, 1, 3, 2, 3, 1, 1, 2}和S = { 0, 1, 2, 3 },根据上面的示例,程序应该返回数量{1, 3, 3, 0}。
N和M都在20,000左右的范围内,但每个数组的高度最高可达1,000,000。 p>解决方案的时间和空间最坏情况复杂度不能超过
O(N + M + max(M) + max(N)).
最后一个约束让我感到困惑:它基本上意味着我不能有任何嵌套的for-loops,而且我似乎无法逃脱这一点。
显然,需要进行一些巧妙的预处理以在每个切片中产生 O(1) 的最终结果,但我一直无法想出。
我继续为每个切片级别创建一个切割编号数组,然后在遍历H 时更新所有这些编号,但结果是O(N*M),因为我需要更新所有较低的高度水平。
是否有适合此任务的数据结构?
【问题讨论】:
-
要挑剔这个问题,您不能使用简单的高度数组来表示所有可能的俄罗斯方块状态。如果你这样做了,那么你永远不会在一个实心块下面有一个空白空间。这个问题更像是对与邻居共享外墙的建筑物进行切片。
-
@Kevin:正确,我可能会更改标题以反映这一点。
-
你知道,当你说数据结构的时候,马上想到的是binary indexed tree。 More info
-
只是为了清楚并切断一些陈述 - 问题归结为给你一个整数数组,你应该能够回答
how many contiguous regions of high no greater than X exist类型的快速查询 -
@Ivaylo:是的,就是这样。我假设在
O(N + C)预处理之后,我应该能够在O(1)中为每个X获取区域计数。
标签: algorithm