博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Leetcode] Subset II
阅读量:4323 次
发布时间:2019-06-06

本文共 1009 字,大约阅读时间需要 3 分钟。

一、一个直接的思路是枚举每一种元素出现的次数,这里实际上是没有重复时的推广,没有重复的时候,出现次数是0 or 1.

返回条件:当前遍历的所有元素的个数已达到最大。

这里的关键实际上变为了如何枚举所有的个数,这种个数可以看做是一种状态,比如:

1 1 1 1 2 2 2 3 3 3 4 4

alldigits: 1 2 3 4

allnums: 4 3 3 2

因此需要在每一层对一种元素的个数进行枚举,为了便于枚举所有状态尤其空状态,使用下面的循环

1 backtrack(index): 2  3   ...... 4  5   for k=1:allnums[index] 6  7      add(alldigits[index]) 8  9      backtrack(index+1)10 11   end for12 13   for k=1:allnums[index]14 15      remove(alldigits[index])16 17   end for18 19   backtrack(index+1);

当然上面的对于空状态的遍历也可以放到非空状态之前,也就是

1 backtrack(index): 2  3   ...... 4      backtrack(index+1); 5   for k=1:allnums[index] 6  7      add(alldigits[index]) 8  9      backtrack(index+1)10 11   end for12 13   for k=1:allnums[index]14 15      remove(alldigits[index])16 17   end for

上面的遍历过程,在对index位的element处理完成之后,就需要将当前所添加的元素都要删除掉。不然在再次达到这个元素时会发生重复。

 

这样就可以遍历所有的状态

二、第一种思路的代价是需要提前知道每一种元素的个数。在【1】中的的思路可以省去这种计算。在每一层递归节点,所选择的元素不能重复,然后从被选择节点的下一个节点开始进行递归。

缺点:如果串比较长,可能会溢出

总结:已改还是第一个比较安全一些。

[1]

[2]

转载于:https://www.cnblogs.com/deepblueme/p/4664780.html

你可能感兴趣的文章
windows系统下安装MySQL
查看>>
错误提示总结
查看>>
实验二+070+胡阳洋
查看>>
Linux IPC实践(3) --具名FIFO
查看>>
Qt之模拟时钟
查看>>
第一次接触安卓--记于2015.8.21
查看>>
(转)在分层架构下寻找java web漏洞
查看>>
mac下多线程实现处理
查看>>
C++ ifstream ofstream
查看>>
跟初学者学习IbatisNet第四篇
查看>>
seL4环境配置
查看>>
Git报错:insufficient permission for adding an object to repository database .git/objects
查看>>
ajax跨域,携带cookie
查看>>
BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
查看>>
洛谷 CF937A Olympiad
查看>>
Codeforces Round #445 C. Petya and Catacombs【思维/题意】
查看>>
用MATLAB同时作多幅图
查看>>
python中map的排序以及取出map中取最大最小值
查看>>
ROR 第一章 从零到部署--第一个程序
查看>>
<form>标签
查看>>