![5bcf88403e800b37c10fb0c82b1359ae.png](https://i-blog.csdnimg.cn/blog_migrate/7a8a1a8137c0fc3b90dc244b2aeb94b0.jpeg)
给定一个数组candidates
和一个目标数target
,找出candidates
中所有可以使数字和为target
的组合。candidates
中的每个数字在每个组合中只能使用一次。 说明:
- 所有数字(包括目标数)都是正整数。
- 解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/combination-sum-ii 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
从名字就能看出是上一题
凌晨:LeetCode 第三十九题 组合总和zhuanlan.zhihu.com![4e8249c5f8b26080b47ae917cf5103bc.png](https://i-blog.csdnimg.cn/blog_migrate/cc4c36823bb222645fa1dae8681a18a4.jpeg)
的升级版本,与上一题目的区别仅是每个数字在每个组合中只能使用一次。为了保证每个数字只是用一次,那么我们每次进入下一层时的起始index
从上一次选定数字的index+1
开始且在同层循环中不出现相同的数字即可。那么我们就将上次的代码修改如下
public IList<IList<int>> CombinationSum2(int[] candidates, int target)
{
IList<IList<int>> result = new List<IList<int>>();
candidates = candidates.OrderBy(n => n).ToArray();//排序为了好排除相同值
CombinationSum2(candidates, target, result, new List<int>(), 0, 0);//从根出发
return result;
}
/// <summary>
///
/// </summary>
/// <param name="candidates">给定的数组</param>
/// <param name="target">目标值</param>
/// <param name="result">结果集合</param>
/// <param name="current">现在选择数字的集合</param>
/// <param name="currentSum">现在数字的和</param>
/// <param name="index">开始取值的位置</param>
/// <returns></returns>
private void CombinationSum2(int[] candidates, int target, IList<IList<int>> result, List<int> current, int currentSum, int index)
{
for (int i = index; i < candidates.Length; i++)
{
if (i>index && candidates[i] == candidates[i - 1]) //同层相等数字略过
{
continue;
}
int value = currentSum + candidates[i];
if (value < target) //值小于目标值,继续
{
List<int> newList = new List<int>(current);
newList.Add(candidates[i]);
CombinationSum2(candidates, target, result, newList, value, i+1);
}
else if (value > target)//值大于目标值因为排过序,跳出即可
{
break;
}
else //值等于目标值,添加结果
{
List<int> newList = new List<int>(current);
newList.Add(candidates[i]);
result.Add(newList);
}
}
}
放入LeetCode中跑一下
执行用时 :280 ms, 在所有 C# 提交中击败了95.24%的用户
内存消耗 :32.1 MB, 在所有 C# 提交中击败了6.45%的用户
性能不错,那么这道题目就讲到这里吧。
![dd2ae422d2fb396cf5e917999ee9dbb7.png](https://i-blog.csdnimg.cn/blog_migrate/6690661861f15e98131654db4cb381d4.jpeg)