给定一个元素数量小于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)
的解法很简单,使用两个循环来计数元素。以下是我对
O(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)的时间内获得,对吗?考虑使用哈希集,但无法想出来。考虑使用一些修改版的kadane算法,但也没有成功。
我渴望了解O(n)的解决方案。我整天都在思考O(n)的解决方案,但我真的卡住了。
由于我不是本地人,因此非常感谢任何帮助使这个问题更好/更易理解的帮助。
i = 2: - s = [0, 1]: c[2] >= c[1] -> 弹出 s = [0]: c[2] >= c[0] -> 弹出 s = []: ans[2] = -1 - 压入 i: s = [2]
应该不是 ans[2] = 2 吗?因为4<3<6 <=> 2个连续位置元素小于c[2]? - Rustin Alexandru