是否发现长度为3的增加(或减少)子序列数量?

时间:2018-07-23 17:49:16

标签: algorithm data-structures

给定一个正整数数组,如何找到长度为3的递增(或递减)子序列数?例如。 [1,6,3,7,5,2,9,4,8]具有24,例如[3,4,8][6,7,9]

我已经找到了长度为k的解决方案,但是我相信那些解决方案可以提高效率,因为我们只关注k = 3

例如,天真的O(n^3)解决方案可以通过遍历元素并计算左边的元素数量少,右边的元素数量高,然后将这两个数量相乘并相加来提高处理速度总而言之。这是O(n^2),显然很难翻译成k > 3

2 个答案:

答案 0 :(得分:3)

解决方案可以是遍历元素,可以在每个元素上计算左边的元素数,而不必使用在O(log(n))中工作的分段树算法,这样就可以计算出多少个元素向右上方移动,然后将这两个计数相乘,然后将其相加。这是O(n*log(n))

您可以在此处了解有关细分树算法的更多信息: Segment Tree Tutorial

答案 1 :(得分:0)

对于每个curr元素,计算左侧和右侧有多少个元素的值越来越小。

此curr元素可以形成less [left] * Greater [right] + Greater [left] * less [right]三元组。

复杂性注意事项

对左右元素进行计数的直接方法产生了二次解。您可能很想在O(log n)时间内使用一套工具或其他工具来计数焊料。

您可以在O(log n)中的一组中找到焊锡额定值,但是,之前和之后的元素计数仍然是线性的。除非您在每个节点跟踪剩余孩子数的地方实施BST。

在此处检查解决方案:

https://leetcode.com/problems/count-number-of-teams/discuss/554795/C%2B%2BJava-O(n- *-n)