题目为 给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
DFS直接遍历,代码如下
IList<IList<int>> res = new List<IList<int>>();
Dictionary<string, int> dic = new Dictionary<string, int>();
public IList<IList<int>> CombinationSum(int[] candidates, int target)
{
candidates= candidates.OrderBy(e => e).ToArray();
GetAllCom(candidates, target, 0, new List<int>(),0);
return res;
}
public void GetAllCom(int[] candidates, int target,int sum,List<int> temp,int begin)
{
if (sum==target)
{
List<int> tempSort = new List<int>(temp);
tempSort.Sort();
StringBuilder sb = new StringBuilder();
foreach (var item in tempSort)
{
sb.Append(item);
}
if (!dic.ContainsKey(sb.ToString()))
{
res.Add(new List<int>(temp));
dic.Add(sb.ToString(), 1);
}
return;
}
for (int i = begin; i < candidates.Length; i++)
{
if (target-sum>=candidates[i])
{
temp.Add(candidates[i]);
sum += candidates[i];
GetAllCom(candidates, target, sum, temp, begin);
temp.RemoveAt(temp.Count() - 1);
sum -= candidates[i];
}
else
{
break;
}
}
}
看了题解,对执行过程进行剪枝,优化后代码如下
IList<IList<int>> res = new List<IList<int>>();
public IList<IList<int>> CombinationSum(int[] candidates, int target)
{
Array.Sort(candidates);
GetAllCom(candidates, target, 0, new List<int>(), 0);
return res;
}
public void GetAllCom(int[] candidates, int target, int sum, List<int> temp, int begin)
{
if (sum == target)
{
res.Add(new List<int>(temp));
return;
}
for (int i = begin; i < candidates.Length; i++)
{
if (sum + candidates[i] > target)
{
return;
}
temp.Add(candidates[i]);
GetAllCom(candidates, target, sum + candidates[i], temp, i);
temp.RemoveAt(temp.Count() - 1);
}
}