题目
求所有子集项
Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
思路
深度搜索
代码
public class Solution
{
private IList<IList<int>> rtn = new List<IList<int>>();
public IList<IList<int>> Subsets(int[] nums)
{
rtn.Add(new List<int>());
rtn.Add(new List<int>(nums));
dfs(nums, new List<int>(), 0, 1); //call dfs
return rtn;
}
//assert: ndigts>=1
//dfs: two return conditions for dfs recursion:
//1. size for an item of this subsets increases to ndigits
//2. depth-first-search for nums[i] with ndigits is NOT to the end point.
private void dfs(int[] nums, IList<int> item, int start, int ndigts)
{
if (ndigts == item.Count)
{
rtn.Add(new List<int>(item));
return; //dfs recursion return condition 1
}
while (ndigts < nums.Length)
{
for (int i = start; i < nums.Length; i++)
{
item.Add(nums[i]);
dfs(nums, item, i + 1, ndigts); //forward 1 to search
item.RemoveAt(item.Count - 1);
}
if (item.Count == 0)
ndigts++;
else //dfs recursion return condition 2
return;
}
}
}