【发布时间】:2017-11-12 06:07:46
【问题描述】:
我最近遇到了一个有趣的编码问题,如下:
有 n 个盒子,让我们假设这是一个由 n 个盒子组成的数组。
对于这个数组的每个索引i,给出三个值-
1.) 重量(i)
2.) 左(i)
3.) 右(i)
left(i) 表示 - 如果选择了weight[i],则不允许我们从该ith element 左侧选择left[i] 元素。
同样,right[i] 表示如果选择了arr[i],则不允许我们从它的右边选择right[i] 元素。
示例:
重量[2] = 5
左[2] = 1
右[2] = 3
然后,如果我在位置 2 选择元素,我会得到 5 个单位的重量。但是,我无法在位置 {1} 处选择元素(由于左约束)。并且无法在 {3,4,5} 位置选择元素(由于右约束)。
目标 - 我们需要计算我们可以选择的权重的最大总和。
示例测试用例:-
**输入:**
5
2 0 3
4 0 0
3 2 0
7 2 1
9 2 0
**输出:**
13
注意 - 第一列是权重,第二列是左约束,第三列是右约束
我使用动态编程方法(类似于最长递增子序列)来获得O(n^2) 解决方案。但是,想不出O(n*logn) 解决方案。 (n can be up to 10^5.)
我还尝试使用优先级队列,其中(right[i] + i) 值较低的元素被赋予更高的优先级(为“i”值较低的元素分配更高的优先级,以防主键值相等)。但是,它也给出了超时错误。
还有其他方法吗?或优先队列方法的任何优化?如果需要,我可以发布我的两个代码。 谢谢。
【问题讨论】:
-
回复:“但是,它也给出了超时错误”:你能链接到你从哪里得到这个问题吗?
-
我发现您的问题描述方式令人困惑。盒子?左/右重量?我认为如果你能更好地描述问题,你可能会更好地解决它!
-
@Aryan,对不起,我看不出答案是 13
-
@ShihabShahriar 将选择第 2 和第 5 个元素(权重分别为 4 和 9),因为这是我们在不与左右约束冲突的情况下可以获得的最大权重。
-
@AryanSharma,你能分享一下问题链接吗?
标签: arrays algorithm dynamic-programming priority-queue