<LeetCode-python3>子集

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

解题思路:
最容易想到的就是排列组合的方法,把数组里的元素进行组合排列,选1个元素的有多少种,再选2个元素的有多少种,再选3个元素的...
但这样时间复杂度很高,要遍历很多次,代码写起来也难受(虽然我并没有写)。
那我们思考有没有其他思路,然后,emmm,没想到。。。
不过我们有度娘,找了一下,有个算法叫做深度优先算法,先看下面这张图片

image.png

我们在数学课上学过,一个长度为n的数组的幂集个数等于2的n次方。
以[1,2,3]为例,我们可以这样理解这个定理:
最开始是个空集,什么都没有,然后我们加了一个1进去,现在有两个子集:
[1]和[]
再加个2进去,然后是4个子集:
[1,2] [2] [1] []
可以发现,有一般是原来的子集,还有一般是在原来每个子集中都加了个2。
所以每多一个数,子集总数就翻倍,也就是2的n次方了。
按照这个思路,我们只需遍历数组nums,然后nums中的元素按上面的思路添加到结果集中就好了。
但编程方式有两种,一种是按照上面的流程写,每拿到一个新元素,在老集合的每次子集中添加新元素,还要保留本身老集合中的所有子集。
还有一种是按照先序遍历的方法,上面那张图就是一棵二叉数,获取叶子节点就行了。
第一种代码如下:

def subsets(nums):
    import copy
    res = [[]]
    for i in nums:
        t = copy.deepcopy(res)
        for j in res:
            j.append(i)
        res.extend(t)
    return res

上面就是按照翻倍的思路写的,速度比较慢了,因为用到了深复制。
然而大佬们四行就搞定了,速度还比我的快得多。

 results = [[]]
    for i in nums:
        results = results + [[i] + num for num in results]
    return results

这段代码一眼能看懂什么意思,但要我自己想可能就想不出来了,所以python还有很多地方需要学习和摸索啊。。
然后是使用二叉树的方法:

    def subsets(self, nums):
        self.results = []
        self.search(sorted(nums), [], 0)
        return self.results
    
    def search(self, nums, S, index):
        if index == len(nums):
            self.results.append(S)
            return
        
        self.search(nums, S + [nums[index]], index + 1)
        self.search(nums, S, index + 1)
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342

推荐阅读更多精彩内容

  • 动态规划 111. 爬楼梯思路类似斐波那契数列注意考虑第 0 阶的特殊情况 272. 爬楼梯 II思路类似上题,只...
    6默默Welsh阅读 2,409评论 0 1
  • LeetCode 刷题随手记 - 第一部分 前 256 题(非会员),仅算法题,的吐槽 https://leetc...
    蕾娜漢默阅读 17,659评论 2 36
  • 一、吃妈妈的菜要用对姿势 这是我家丫头放假回家的写照,这也是她去年随手的涂鸦,名为:吃妈妈的菜要用对姿势,和她同龄...
    草草啖盐说蜜阅读 455评论 7 7
  • 这个世界上永远 不要试图去说服谁,每个人都活在自己的世界里,有些道理明白了尚好,如果不明白就随他去吧
    孤灯下的夜行人阅读 324评论 0 0