LeetCode第216题--组合总和III

本文深入探讨了寻找所有相加之和为n的k个数的组合算法,仅使用1-9的正整数且无重复。通过递归回溯方法,实现了解集不包含重复组合的目标,提供了一个清晰的代码实现示例。

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

找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。

说明:
所有数字都是正整数。
解集不能包含重复的组合。

示例 1:
输入: k = 3, n = 7
输出: [[1,2,4]]

示例 2:
输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

class Solution {
    
    void dfs(vector<int> &candidates, vector<vector<int>> &vecRes, vector<int> &vecTmp, int target, int k, int index, int step)
    {
        for(int i = index; i < candidates.size(); i++)
        {
            if(target < candidates[i] || step > k)
            {
                return;
            }
            else if(target == candidates[i])
            {
                if(step == k)
                {
                    vecTmp.push_back(candidates[i]);
                    vecRes.push_back(vecTmp);
                    vecTmp.pop_back();		//注意此处也需要回溯
                    return;
                }
                else
                {
                    return;
                }
            }
            else
            {
                vecTmp.push_back(candidates[i]);
                dfs(candidates, vecRes, vecTmp, target-candidates[i], k, i+1, step+1);
                vecTmp.pop_back();
            }
        } 
    }
public:
    vector<vector<int>> combinationSum3(int k, int n) {
        vector<vector<int>> vecRes;
        if(k > 9 || n < (1+k)*k/2) return vecRes;		//剔除掉不符合情况的输入
        vector<int> vecTmp;
        int numBuf[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
        vector<int> candidates;
        if(n < 9)			//注意对n输入小于9时作区分
        {
            candidates.assign(numBuf, numBuf+n);
        }
        else
        {
            candidates.assign(numBuf, numBuf+9);
        }
        dfs(candidates, vecRes, vecTmp, n, k, 0, 1);		//注意step步数从1开始
        return vecRes;
    }
};

典型的递归回溯的题目,注意结束的条件判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值