Solution to LeetCode 334 Increasing Triplet Subsequence.
LeetCode 334
Increasing Triplet Subsequence (Medium). [link]
1] Bi-directional iteration. MIN stores the smaller values for each value in nums and MAX stores the larger values for each value in nums. We iterate through the nums to find if there is a value satisfying MIN[i-1] < nums[i] < MAX[i+1]. Time complexity O(n), space complexity O(n).
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
if n < 3:
return False
MIN = [0] * n
MIN[0] = nums[0]
for i in range(1, n):
MIN[i] = min(MIN[i-1], nums[i])
MAX = [0] * n
MAX[n - 1] = nums[-1]
for j in range(n-2, -1, -1):
print(j)
MAX[j] = max(MAX[j+1], nums[j])
for k in range(1, n-1):
if MIN[k-1] < nums[k] < MAX[k+1]:
return True
return False
2] Greedy. To find a triplet subsequence (first, second, num), we want first and second to be as small as possible. Time complexity O(n), space complexity O(1).
class Solution(object):
def increasingTriplet(self, nums):
"""
:type nums: List[int]
:rtype: bool
"""
n = len(nums)
if n < 3:
return False
first, second = nums[0], float('inf')
for i in range(1, n):
num = nums[i]
if num > second:
return True
if num > first:
second = num
else:
first = num
return False