LeetCode 491题 “Increasing Subsequences” 是一个中等难度的题目,主要考察的是深度优先搜索(DFS)和回溯算法。题目要求找到给定数组中的所有递增子序列。
题目描述
给定一个整型数组,你的任务是找到所有的递增子序列,递增子序列的长度至少为2。
示例
输入: [4, 6, 7, 7]
输出: [[4, 6], [4, 7], [4, 6, 7], [4, 6, 7, 7], [6, 7], [6, 7, 7], [7,7], [4,7,7]]
解题思路
- 深度优先搜索(DFS):通过递归的方式遍历所有可能的子序列。
- 回溯:在递归过程中,如果当前子序列不再满足递增条件,则回溯到上一步。
- 去重:使用集合来避免重复的子序列。
详细步骤
- 初始化:定义一个结果集
res和一个临时路径path。 - 递归函数:定义一个递归函数
dfs(start),从数组的start位置开始搜索。 - 递归终止条件:当遍历到数组末尾时,检查
path的长度是否大于1,如果是则加入结果集。 - 递归逻辑:
- 遍历从
start到数组末尾的所有元素。 - 如果当前元素可以加入
path(即当前元素大于path的最后一个元素或者path为空),则将其加入path并继续递归。 - 递归结束后,回溯,即从
path中移除当前元素。
- 遍历从
代码实现
def findSubsequences(nums):
def dfs(start, path):
if len(path) > 1:
res.append(path[:])
used = set()
for i in range(start, len(nums)):
if nums[i] in used:
continue
if not path or nums[i] >= path[-1]:
used.add(nums[i])
dfs(i + 1, path + [nums[i]])
res = []
dfs(0, [])
return res
示例
nums = [4, 6, 7, 7] print(findSubsequences(nums))
代码解释
findSubsequences函数:主函数,初始化结果集res并调用dfs函数。dfs函数:start:当前开始搜索的位置。path:当前递增子序列。used:用于去重的集合,避免在同一层递归中使用相同的元素。
- 递归逻辑:
- 遍历从
start到数组末尾的所有元素。 - 如果当前元素未在当前层使用过,并且可以加入
path,则加入path并继续递归。 - 递归结束后,回溯。
- 遍历从
复杂度分析
- 时间复杂度:O(2^N),在最坏情况下,每个元素都有两种选择(加入或不加入子序列)。
- 空间复杂度:O(N),递归栈的深度最多为 N。
通过上述步骤和代码实现,可以有效地找到数组中的所有递增子序列。希望这个详细的解答对你有所帮助!如果有任何进一步的问题,欢迎继续提问。
发表回复