diff --git a/solutions/334. Increasing Triplet Subsequence.md b/solutions/334. Increasing Triplet Subsequence.md new file mode 100644 index 0000000..62d8a8e --- /dev/null +++ b/solutions/334. Increasing Triplet Subsequence.md @@ -0,0 +1,13 @@ +# [334. Increasing Triplet Subsequence](https://leetcode.com/problems/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的方式为: