设为首页 收藏本站
查看: 875|回复: 0

[经验分享] leetcode 【 Subsets 】python 实现

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-3 12:43:08 | 显示全部楼层 |阅读模式
  题目
  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



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+[S])
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)→到头了
  这样一个深度就遍历出来了[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()就好了

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146803-1-1.html 上篇帖子: Python尾递归 下篇帖子: python多线程--优先级队列(Queue)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表