ii 组合总和_LeetCode 第四十题 组合总和 II

5bcf88403e800b37c10fb0c82b1359ae.png
给定一个数组 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

的升级版本,与上一题目的区别仅是每个数字在每个组合中只能使用一次。为了保证每个数字只是用一次,那么我们每次进入下一层时的起始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
想了解更多,扫码关注我的公众号 IP的dotNet吧
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值