算法 集合的所有子集 全排列
{1,2,3} 的所有排列组合方式
{{1},{2},{3}}
{{1},{2,3}}
{{1,2},{3}}
{{1,3},{2}}
{{123}}
请大家给个想法 或者 算法实现
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
{1,2,3} 的所有排列组合方式
{{1},{2},{3}}
{{1},{2,3}}
{{1,2},{3}}
{{1,3},{2}}
{{123}}
请大家给个想法 或者 算法实现
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(7)
这个我想到高中的排列组合,用的是隔板法(不太记得是不是叫这个)。
比如,隔板是说在1|2|3|4 数字中间放的分隔板。
分成一个集合,不用隔板
分成两个集合,放一个隔板,共C(n-1,1),比如{1|234} {12|34} {123|4}
分成k个集合,放k-1个隔板,共C(n-1,k-1)种。
然后想如何实现隔板,给隔板编号1 , 2 , ... , n-1
于是每次放k个隔板意味着从n-1个数中取出k个数字,就是组合数,可以用回溯遍历出来
讲的好,如果不存储全部的子集的话,每次维护/保存当前i的子集的序列,每次加一个i+1时,只需要输出i,和将i加到当前序列里面就可以了。
如果不存储全部的子集的话,只需要复制seq,再添加num到其中一个seq中去即可,再加一个{num}。
咦?其实这个也可以直接一个循环,不用DFS还要浪费栈,因为num是从1到n没有变化的呀!
public class Solution {
}
递归大法好:
附测试代码:
测试结果:
1、深度优先搜索实现
2、状态压缩用位表示集合
可以实现对一个集合的所有子集的枚举
用位向量啊
若对应位置1,则表示后面插一个板
output:
递归实现就可以了