Combination Sum / Subset

39. Combination SumAC代码
给定数组candidates,不含重复元素,求一个组合(允许重复使用),使得和为target

class Solution {
public:
    vector<int> x;
    vector<vector<int>> result;

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort( candidates.begin(), candidates.end() );
        dfs( candidates, target, 0, 0 );
        return result;
    }

    // 参数index表示数组nums[index..end]用于构造x
    void dfs( vector<int>& nums, int target, int cur_sum, int index )
    {
        if( cur_sum == target )
        {
            result.push_back(x);
            return;
        }
        else if( cur_sum > target )
            return;

        for( int i = index; i < nums.size(); i++ )
        {
            x.push_back( nums[i] );
            dfs( nums, target, cur_sum + nums[i], i );  // 此处设置了参数index为i,保证构造的x是升序的
            x.pop_back();
        }
    }
};

【相似题目】78. SubsetsAC代码

40. Combination Sum IIAC代码
给定数组candidates,存在重复元素,求一个组合(每个元素只允许使用1次),使得和为target

class Solution {
public:
    vector<int> x;
    vector<vector<int>> result;

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        sort( candidates.begin(), candidates.end() );
        dfs( candidates, target, 0, 0 );
        return result;
    }

    void dfs( vector<int>& nums, int target, int cur_sum, int index )
    {
        if( cur_sum == target )
        {
            result.push_back(x);
            return;
        }
        else if( cur_sum > target )    // 剪枝
            return;

        for( int i = index; i < nums.size(); i++ )
        {
            // 去除另一种重复:[6(1), 7(1)], [6(2), 7(1)],第1个“6”和第2个“6”
            if( i > index && nums[i] == nums[i - 1] )
                continue;

            x.push_back( nums[i] );
            dfs( nums, target, cur_sum + nums[i], i + 1 );
            x.pop_back();
        }
    }
};

【相似题目】90. Subsets IIAC代码

216. Combination Sum IIIAC代码

猜你喜欢

转载自blog.csdn.net/o0Helloworld0o/article/details/81488321