博客
关于我
【Leetcode刷题】递增子序列
阅读量:448 次
发布时间:2019-03-06

本文共 1032 字,大约阅读时间需要 3 分钟。

class Solution(object):    def findSubsequences(self, nums):        """nums: List[int]"""        if not nums:            return []                result = []        path = []        n = len(nums)                def trace(start):            if len(path) >= 2:                result.append(path[:])                        memo = set()            for i in range(start, n):                if nums[i] in memo:                    continue                if not path:                    path.append(nums[i])                elif nums[i] >= path[-1]:                    path.append(nums[i])                else:                    continue                memo.add(nums[i])                trace(i + 1)                path.pop()                trace(0)        return result

这个算法通过递归的方式遍历所有可能的子序列,并使用memoization技术来避免重复计算。具体来说,它维护了一个路径记录当前选择的数字序列,以及一个集合来记录已经访问过的数字,以防止重复选择相同的数字。这样可以有效地去重,确保每个子序列都是唯一的。

在时间复杂度方面,尽管看起来是O(n * 2^n),但由于递归函数中有剪枝操作(比如通过memo来跳过已经处理过的数字),实际上的复杂度会有所优化,但仍然保持在O(n * 2^n)的级别。空间复杂度方面,path和memo都只占用O(n)的空间,这使得算法在空间上非常高效。

转载地址:http://tylyz.baihongyu.com/

你可能感兴趣的文章
OSError: no library called “cairo-2“ was foundno library called “cairo“ was foundno library called
查看>>
OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
查看>>
osgearth介绍
查看>>
OSGi与Maven、Eclipse PlugIn的区别
查看>>
Osgi环境配置
查看>>
OSG——选取和拖拽
查看>>
OSG中找到特定节点的方法(转)
查看>>
OSG学习:C#调用非托管C++方法——C++/CLI
查看>>
OSG学习:OSG组成(三)——组成模块(续):OSG核心库中的一些类和方法
查看>>
OSG学习:OSG组成(二)——渲染状态和纹理映射
查看>>
OSG学习:WIN10系统下OSG+VS2017编译及运行
查看>>
OSG学习:人机交互——普通键盘事件:着火的飞机
查看>>
OSG学习:几何体的操作(一)——交互事件、简化几何体
查看>>
OSG学习:几何体的操作(二)——交互事件、Delaunay三角网绘制
查看>>
OSG学习:几何对象的绘制(一)——四边形
查看>>
OSG学习:几何对象的绘制(三)——几何元素的存储和几何体的绘制方法
查看>>
OSG学习:几何对象的绘制(二)——简易房屋
查看>>
OSG学习:几何对象的绘制(四)——几何体的更新回调:旋转的线
查看>>
OSG学习:场景图形管理(一)——视图与相机
查看>>
OSG学习:场景图形管理(三)——多视图相机渲染
查看>>