题目

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. ASP.NET中登陆验证码的生成和输入验证码的验证

    一:验证码的生成实现代码 protected void Page_Load(object sender, EventArgs e)    {        string validateCode = ...

  2. c++树的表示方法

    c++树的节点的表示方法: typedef struct Node *Tree; struct Node { int data; Node *left; Node *right; int flag; ...

  3. 部署git服务器(Windows Server 2008)

    原来的这个项目是一个人开发的,没有做版本管理,我接手后准备搭建git版本管理服务端,方便离线开发和做版本管理: 一台云主机,操作系统:Windows Server 2008,64位: java已经安装 ...

  4. Android(java)学习笔记83:各种边距设置

    1. 各种边距设置: (1)android:layout_paddingLeft 内边距,对谁用,指的是谁的内部内容边距 (2)android:layout_marginLeft 外边距,对谁用,指的 ...

  5. Shell重启Tomcat脚本

    #!/bin/bash echo -e "\n\n\n" #force kill flag,if equal [f] to force kill all flag="He ...

  6. java从键盘输入学生成绩,找出最高分,并输出学生成绩等级。

    /*从键盘输入学生成绩,找出最高分,并输出学生成绩等级:成绩 >=最高分-10 等级为A成绩 >=最高分-20 等级为B成绩 >=最高分-30 等级为C其余为 等级为D 提示:先输入 ...

  7. 问题002:我们要使用的Java是哪个版本的?什么是JVM、JRE、JDK、IDE、API?

    三个版本:1.java SE 标准版 2.java EE企业版 3.Java ME 小型版本 JVM (java virtual machine) java虚拟机 JRE(java runtime e ...

  8. hprose 1.0(rpc 框架) - 执行时序图

  9. Python知识点入门笔记——特色数据类型(集合)

    集合是一种不重复的无序集 集合用花括号来定义{} 集合和字典一样,里面的顺序是无序的,{1,2,3}和{3,2,1}是相等的 集合的元素不可重复,也就是说{1,2,2,3}是不存在的,应该写为{1,2 ...

  10. [译]The Python Tutorial#11. Brief Tour of the Standard Library — Part II

    [译]The Python Tutorial#Brief Tour of the Standard Library - Part II 第二部分介绍更多满足专业编程需求的高级模块,这些模块在小型脚本中 ...