leetcode[40] Combination Sum II

本文介绍了一个算法问题,即在给定一组候选数字和一个目标数字的情况下,如何找到所有不重复的组合,使得这些组合中的数字之和等于目标数字。特别地,每个数字在每组组合中只能使用一次。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given a collection of candidate numbers (candidates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.
Each number in candidates may only be used once in the combination.
Note:
 All numbers (including target) will be positive integers. The solution set must not contain duplicate combinations.
Example 1:
Input: candidates = [10,1,2,7,6,1,5], target = 8,
 A solution set is:
 [
 ⁠ [1, 7],
 ⁠ [1, 2, 5],
 ⁠ [2, 6],
 ⁠ [1, 1, 6]
 ]
 
 Example 2:
 Input: candidates = [2,5,2,1,2], target = 5,
 A solution set is:
 [
 [1,2,2],
 [5]
 ]
 
题目大意:
数组中有重复的数字,每个数字只能被使用一次,找出等于目标数字的排列组合。
 
解法:
这道题基于上面一道题稍微变了一点点,每个数字只能使用一次。基于上面一道题,就是将递归调用那一行
combinationCore(candidates,i+1,tmpSum,target,tmp,res);中的i变成了i+1
并且添加了if(i>index && candidates[i]== candidates[i-1]) continue,如果说数组中有重复的值则跳过这个值。
C++:
class Solution {
private:
    void combinationCore(vector<int>candidates,int index,int tmpSum,int target,vector<int>&tmp,vector<vector<int>>&res){
        if(tmpSum>target) return;
        if(tmpSum==target) {
            res.push_back(tmp);
            return;
        }
        for(int i=index;i<candidates.size();i++){
            if(i>index && candidates[i]== candidates[i-1]) continue;
            tmpSum+=candidates[i];
            tmp.push_back(candidates[i]);
            combinationCore(candidates,i+1,tmpSum,target,tmp,res);
            tmpSum-=candidates[i];
            tmp.pop_back();
        }
    }

public:
    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<vector<int>>res;
        vector<int>tmp;
        combinationCore(candidates,0,0,target,tmp,res);

        return res;
    }
};

 Python:

class Solution(object):
    def combinationCore(self,nums,index,tmp,target,res):
        if target<0:
            return
        if not target:
            res.append(tmp)
            return
        for i in range(index,len(nums)):
            if i>index and nums[i]==nums[i-1]:
                continue
            self.combinationCore(nums,i+1,tmp+[nums[i]],target-nums[i],res)
        


    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        candidates.sort()
        res=[]
        self.combinationCore(candidates,0,[],target,res)

        return res

  

转载于:https://www.cnblogs.com/xiaobaituyun/p/10595267.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值