组合总和
解题思路:
回溯。深度优先搜索,每一次都从当前位置开始就可以避免重复。
代码:
public IList<IList<int>> CombinationSum(int[] candidates, int target)
{
IList<IList<int>> result = new List<IList<int>>();
Array.Sort(candidates);//先排序。
int begin = 0;//每次从哪个位置开始搜索。
IList<int> lgx = new List<int>();
DFS(candidates, target, begin, lgx, result);
return result;
}//39. 组合总和。
public void DFS(int[] candidates,int target,int begin,IList<int> lgx,IList<IList<int>> result)
{
if(target==0)
{
result.Add(new List<int>(lgx));
return;
}//返回情况。
for(int i=begin;i<candidates.Length;i++)
{
if (target - candidates[begin] < 0)
break;
lgx.Add(candidates[i]);
DFS(candidates, target - candidates[i], i, lgx, result);
lgx.RemoveAt(lgx.Count - 1);//回溯要把后面的去掉。
}
}//回溯,深度优先搜索,找出每一种不同的组合。