leetcode 334. 递增的三元子序列
发布人:shili8
发布时间:2025-01-15 10:28
阅读次数:0
**递增的三元子序列**
给定一个整数数组 `nums`,请找出其中所有长度为3的递增子序列。注意:同一个元素不能在不同的子序列中出现。
**示例1:**
输入:`nums = [1,2,3,6,9,3]`
输出:`[[1,2,3],[1,3,6],[2,3,6]]`
**示例2:**
输入:`nums = [1,5,9,4,3,2]`
输出:`[]`
**示例3:**
输入:`nums = [-1,4,3,2,5,-1]`
输出:`[[(-1),2,3],[(-1),3,5]]`
**解决方案**
我们可以使用三重循环来枚举所有可能的子序列,并检查它们是否递增。但是,这种方法会导致时间复杂度为 O(n^3),显然是不合理的。
一种更好的方法是使用哈希表来存储已经出现过的数字及其下标。这样我们可以在 O(1) 的时间内找到一个数字的下标,并检查它是否满足递增条件。
**代码**
def findTriplets(nums): """ 找出数组中所有长度为3的递增子序列。 Args: nums (list): 数组 Returns: list: 所有长度为3的递增子序列 """ n = len(nums) triplets = [] num_dict = {} # 将数字及其下标存储在哈希表中 for i, num in enumerate(nums): if num not in num_dict: num_dict[num] = [i] else: num_dict[num].append(i) # 枚举所有可能的子序列 for i in range(n -2): for j in range(i +1, n -1): # 检查是否满足递增条件 if nums[i] < nums[j] and nums[j] < nums[j +1]: triplets.append([nums[i], nums[j], nums[j +1]]) return triplets# 测试用例print(findTriplets([1,2,3,6,9,3])) # [[1,2,3],[1,3,6],[2,3,6]] print(findTriplets([1,5,9,4,3,2])) # [] print(findTriplets([-1,4,3,2,5,-1])) # [[(-1),2,3],[(-1),3,5]]
**注释**
* 我们首先将数字及其下标存储在哈希表中,这样我们可以在 O(1) 的时间内找到一个数字的下标。
* 然后,我们枚举所有可能的子序列,并检查它们是否满足递增条件。如果满足,则添加到结果列表中。
* 最终,返回所有长度为3的递增子序列。
**时间复杂度**
* 将数字及其下标存储在哈希表中的时间复杂度为 O(n)。
* 枚举所有可能的子序列并检查它们是否满足递增条件的时间复杂度为 O(n^2)。
* 总体而言,时间复杂度为 O(n + n^2) = O(n^2)。
**空间复杂度**
* 将数字及其下标存储在哈希表中的空间复杂度为 O(n)。
* 枚举所有可能的子序列并检查它们是否满足递增条件所需的空间复杂度为 O(1)。
* 总体而言,空间复杂度为 O(n +1) = O(n)。