【发布时间】:2017-01-11 16:45:34
【问题描述】:
给定一个包含N < 10 000 元素的数组,对于数组中的每个位置i,找出(以最有效的方式)从它左边开始有多少个连续元素(即从位置i-1 到0)小于或等于array[i]。
这是一个例子:
Array: 4 3 6 1 1 2 8 5 9
Res: 0 0 2 0 1 2 6 0 8
( pos 0 (element 4) -> 0 consecutive elements before it,
pos 1 (element 3) -> 0 consecutive elements before it smaller than 3 (4>3)
pos 2 (element 6) -> 2 consecutive elements before it smaller than 6 (4,3)
and so on..
)
我认为这是一个动态编程问题,因为它在问题中说“最有效的方法”,并且在解决方案中它说有一个 O(n) 解决方案。
O(n^2) 解决方案很简单,两个循环,计算元素。
这是我对0(n) 的看法。有人会假设:
for (int i = 1; i < array.Length; i++) {
if (array[i-1] > array[i])
{
c [i] = 0;
}
else {
c [i] = c [i - 1] + MAGIC_FORMULA;
}
}
显然,如果我找到一个大于下一个的元素,结果显然是 0(左边没有比它小的数字)。
但是前面的结果告诉我什么让我可以使用动态编程?我找不到那个案例的任何复发。此外,该公式必须在O(1) 中获得,整个解决方案为O(n),对吗?想过使用哈希集,但无法弄清楚。考虑过使用 kadane 算法的一些修改版本,但没有成功。
我很想了解O(n) 解决方案。我整天都在考虑O(n) 解决方案,但我真的被困住了。
我不是本地人,因此非常感谢任何有助于使这个问题更好/更易于理解的帮助。
【问题讨论】:
标签: arrays algorithm dynamic-programming