组合总和 III

问题描述

找出所有相加之和为 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]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/combination-sum-iii

思路

这个题比较简单,用到的是回溯算法。
要解决的问题是在1~9之间选择k个数字,使得他们的和为n。每次选择的数字是1~9,因为不能重复,所以每次递归从上一次的位置加1开始,将每次递归的结果存到一个tmp数组里面,当tmp的size到k时,判断他们的和是否为n,如果为n,将tmp插入到ret,不管sum是否等于n,都要返回到上一层。返回到上一层后,千万别忘记,将sum减i,并且在tmp中弹出i;

题解

class Solution {
public:
    vector<int> tmp;
    vector<vector<int>> ret;
    vector<vector<int>> combinationSum3(int k, int n) {
        dfs(k,n,0,1);
        return ret;
    }
    void dfs(int k,int n,int sum,int location){
        if(tmp.size()==k){
            if(sum==n){
                ret.push_back(tmp);
            }
            return;
        }
        for(int i=location;i<=9;i++){
            tmp.push_back(i);
            sum=sum+i;
            dfs(k,n,sum,i+1);
            sum=sum-i;
            tmp.pop_back();
        }

    }
};

标签: none

添加新评论