组合总和的归纳总结

发布时间 2023-10-27 18:00:29作者: luxiayuai

组合总和题目类型

组合总和在力扣上主要有四种形式。

组合总和

组合总和Ⅱ

组合总和Ⅲ

组合总和Ⅳ

其中,前三道通常采用回溯法来做,第四道采用动态规划来做。

组合总和关键点

对以上的题目进行总结,可以发现组合总和有几个关键点。

1. 数组有无重复元素。无重复元素①,有重复元素②

2. 同一个数字是否可以被无限次选取。每个数字只能被选取一次③,每个数字可以被无限次选取④

3. 顺序不同的序列被视作不同的组合(排列)⑤,顺序不同但是元素相同被视作相同的组合(组合)⑥

其中,组合总和①④⑥,组合总和Ⅱ②③⑥,组合总和Ⅲ①③⑥,组合总和Ⅳ①④⑤

分析

几种组合总和之间的关系

可以注意到,组合总和与组合总和Ⅳ的区别在于结果是组合形式还是排列形式。此外,由于组合总和Ⅳ的数据量更大,因此采用回溯算法会造成超时。 

组合总和Ⅱ与组合总和Ⅲ的差别在于数组中是否有重复元素。因此,组合总和Ⅱ在实现中需要专门用sort()和vis数组实现。

②⑥组合,需要借助sort()排序和vis数组实现

有③,回溯法下次迭代时idx还是从i+1开始

 for(int i = idx; i < n; i ++ ) {
        path.push_back(candidates[i]);
        dfs(candidates, target, n, i + 1, sum + candidates[i]);
        path.pop_back();
}

有④,回溯法下次迭代时idx还是从i开始

 for(int i = idx; i < n; i ++ ) {
        path.push_back(candidates[i]);
        dfs(candidates, target, n, i, sum + candidates[i]);
        path.pop_back();
}

其余的组合类型题目

②④组合不可能出现,否则②会失去意义。

因此,其实还可以有两种组合类型的题目:分别是①③⑤和②③⑤。

①③⑤和②③⑤均可以采用动态规划01背包做法,先遍历背包再遍历物品。