给定一个正整数数组,如何找到长度为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
。
答案 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)