题目

Given a set of distinct integers, S, return all possible subsets.

Note:

  • Elements in a subset must be in non-descending order.
  • The solution set must not contain duplicate subsets.

For example,
If S = [1,2,3], a solution is:

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

代码:oj测试通过 Runtime: 71 ms

 class Solution:
# @param S, a list of integer
# @return a list of lists of integer
def dfs(self, start, S, result, father_subsets):
result.append(father_subsets)
for i in range(start, len(S)):
self.dfs(i+1, S, result, father_subsets+[S[i]])
def subsets(self, S):
# none case
if S is None:
return []
# deep first search
result = []
self.dfs(0, sorted(S), result, [])
return result

思路

深度优先遍历本科时候学过,四五年不看了都忘光了,通过这道题捡起来一些。

总体思路是深度优先算法回溯。

1. 先处理输入为空的special case

2. 定义一个存放返回结果的数组result

3. 以题目中给的按照题意进行深度优先遍历:

  []

  1→12→123

   →13

  2→23

  3

按照上面的便利顺序遍历,就可以得到所有的子集(要包括空元素)

具体的解释是

第一轮深度遍历:把以1开头的先都列出来→以1开头的,后接数组剩余元素中最小的元素(这个元素是2)→以12开头的,后接数组剩余元素中最小的元素(这个元素是3)→到头了

这样一个深度就遍历出来了[1] [1,2] [1,2,3]三个子集

第二轮深度遍历: 可以遍历出来[2] [23,]两个子集

第三轮深度遍历: 可以遍历出来[3]一个子集

每轮都传递一个数组起始指针的值,来保证上述遍历顺序。

这样3轮遍历保证能找到全部1开头,2开头,3开头的所有子集;同时,由于每轮遍历后又把上轮的头元素去掉,保证不会出现重复子集。

4. 这个代码主要出于简洁性的考虑,每次调用dfs都传递数组S,多少影响了效率。

5. 另外,还有一个小坑就是pyhton的list.sort()函数。这个函数返回的是NoneType,之前提交了几次都不通过,后来查了一下。找到了这篇日志:

http://blog.csdn.net/trochiluses/article/details/16863871

后来改用内建函数sorted()就好了

leetcode 【 Subsets 】python 实现的更多相关文章

  1. [leetcode]Subsets @ Python

    原题地址:https://oj.leetcode.com/problems/subsets/ 题意:枚举所有子集. 解题思路:碰到这种问题,一律dfs. 代码: class Solution: # @ ...

  2. LeetCode:Subsets I II

    求集合的所有子集问题 LeetCode:Subsets Given a set of distinct integers, S, return all possible subsets. Note: ...

  3. LeetCode Subsets II (DFS)

    题意: 给一个集合,有n个可能相同的元素,求出所有的子集(包括空集,但是不能重复). 思路: 看这个就差不多了.LEETCODE SUBSETS (DFS) class Solution { publ ...

  4. LeetCode专题-Python实现之第28题: Implement strStr()

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  5. LeetCode专题-Python实现之第27题:Remove Element

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  6. LeetCode专题-Python实现之第26题:Remove Duplicates from Sorted Array

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  7. LeetCode专题-Python实现之第21题:Merge Two Sorted Lists

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  8. LeetCode专题-Python实现之第20题:Valid Parentheses

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  9. LeetCode专题-Python实现之第9题:Palindrome Number

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

  10. LeetCode专题-Python实现之第14题:Longest Common Prefix

    导航页-LeetCode专题-Python实现 相关代码已经上传到github:https://github.com/exploitht/leetcode-python 文中代码为了不动官网提供的初始 ...

随机推荐

  1. WPF中的StackPanel、WrapPanel、DockPanel(转)

    一.StackPanel StackPanel是以堆叠的方式显示其中的控件 1.可以使用Orientation属性更改堆叠的顺序 Orientation="Vertical" 默认 ...

  2. android通过fiddler代理,抓取网络请求

    安装fiddler过程省略 1, 2, 3, 4,手机需要跟电脑处于同一局域网,设置网络代理为电脑在局域网内的ip,端口为3步设置的port 5,电脑就可以通过fiddler监控手机的所有网络请求了( ...

  3. 【C++】【MFC】创建新的线程函数

    DWORD WINAPI MyThreadProc (LPVOID lpParam){ somestruct* pN = (somestruct*)lpParam; // 将参数转为你的类型 ... ...

  4. Zabbix邮件报警设置方法

    实现目的: 在Zabbix服务端设置邮件报警,当被监控主机宕机或者达到触发器预设值时,会自动发送报警邮件到指定邮箱. 具体操作: 以下操作在Zabbix监控服务端进行 备注:Zabbix监控服务端 操 ...

  5. Windows下用cmd命令安装及卸载服务[转]

    第一种方法: 1. 开始 ->运行 ->cmd2. cd到C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727(Framework版本号按IIS配置) ...

  6. LeetCode OJ Container With Most Water 容器的最大装水量

    题意:在坐标轴的x轴上的0,1,2,3,4....n处有n+1块木板,长度不一,任两块加上x轴即可构成一个容器,其装水面积为两板的间距与较短板长之积,以vector容器给出一系列值,分别代表在0,1, ...

  7. Netweaver和CloudFoundry里的trace开关

    Netweaver 事务码SU01的参数设置里,有很多关于trace(跟踪)的开关. FPTRACELEVEL: 设成04后,能将ADS生成PDF的trace信息写入生成的PDF. 详细原理参考我的b ...

  8. 在linux 下为sublime Text 2 配置c#编译环境

    各位看官别笑我,在虚拟机上跑了了xp  xp里面安装了vs2008,然后电脑性能实在是太差了,所以装sublime用来编写代码,然后再统一由vs2008来调试. 说正事. 安装好sublime 之后, ...

  9. Cesium专栏-测量工具测距、测面、测高(附源码下载)

    Cesium Cesium 是一款面向三维地球和地图的,世界级的JavaScript开源产品.它提供了基于JavaScript语言的开发包,方便用户快速搭建一款零插件的虚拟地球Web应用,并在性能,精 ...

  10. 操作DOM -------JavaScrip

    本文摘要:http://www.liaoxuefeng.com/ 经常用到. 由于HTML文档被浏览器解析后就是一棵DOM树,要改变HTML的结构,就需要通过JavaScript来操作DOM. 始终记 ...