LeetCode/solutions/334. Increasing Triplet Subsequence.md
2019-12-08 21:31:41 +08:00

1.1 KiB
Raw Blame History

334. Increasing Triplet Subsequence

思路

这道题让我们求一个无序数组中是否包含一个三个元素的递增子序列并要求时间复杂度O(n)空间复杂度O(1)。

时间复杂度O(n)很好满足但是空间复杂度要想O(1)就有点难想了。 因为我们可以用两个dp数组dp1和dp2可以优化成只用一个dp数组dp1[i]和dp2[i]分别代表nums[i]前面的最小值和后面的最大值, 然后再判断是否存在dp1[i] < nums[i] < dp2[i]就可以了这种方法时间复杂度是满足的但是空间复杂度为O(n),不满足题意。

我们定义m2为到目前为止最有可能构成三元递增序列第二个元素的候选者即需满足m2尽可能小且在m2之前存在比m2小的数。 这样定义之后如果我们一旦遇到某个数nums[i]比m2大说明找到了三元递增序列。问题关键在于如何维持m2。

为此我们需要再定义一个数m1为到目前为止最有可能构成三元递增序列第一个元素的候选者也即到目前为止的最小值更新m1和m2的方式为