leng 发表于 2015-12-3 12:43:08

leetcode 【 Subsets 】python 实现

  题目:
  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 = , a solution is:

[
,
,
,
,
,
,
,
[]
]
  代码:oj测试通过 Runtime: 71 ms



1 class Solution:
2   # @param S, a list of integer
3   # @return a list of lists of integer
4   def dfs(self, start, S, result, father_subsets):
5         result.append(father_subsets)
6         for i in range(start, len(S)):
7             self.dfs(i+1, S, result, father_subsets+])
8   def subsets(self, S):
9         # none case
10         if S is None:
11             return []
12         # deep first search
13         result = []
14         self.dfs(0, sorted(S), result, [])
15         return result
  
  思路:
  深度优先遍历本科时候学过,四五年不看了都忘光了,通过这道题捡起来一些。
  总体思路是深度优先算法回溯。
  1. 先处理输入为空的special case
  2. 定义一个存放返回结果的数组result
  3. 以题目中给的按照题意进行深度优先遍历:
  []
  1→12→123
  →13
  2→23
  3
  按照上面的便利顺序遍历,就可以得到所有的子集(要包括空元素)
  具体的解释是:
  第一轮深度遍历:把以1开头的先都列出来→以1开头的,后接数组剩余元素中最小的元素(这个元素是2)→以12开头的,后接数组剩余元素中最小的元素(这个元素是3)→到头了
  这样一个深度就遍历出来了 三个子集
  第二轮深度遍历: 可以遍历出来 两个子集
  第三轮深度遍历: 可以遍历出来一个子集
  每轮都传递一个数组起始指针的值,来保证上述遍历顺序。
  这样3轮遍历保证能找到全部1开头,2开头,3开头的所有子集;同时,由于每轮遍历后又把上轮的头元素去掉,保证不会出现重复子集。
  4. 这个代码主要出于简洁性的考虑,每次调用dfs都传递数组S,多少影响了效率。
  5. 另外,还有一个小坑就是pyhton的list.sort()函数。这个函数返回的是NoneType,之前提交了几次都不通过,后来查了一下。找到了这篇日志:
  http://blog.csdn.net/trochiluses/article/details/16863871
  后来改用内建函数sorted()就好了
页: [1]
查看完整版本: leetcode 【 Subsets 】python 实现