🤵♂️ 个人主页:@rain雨雨编程
😄微信公众号:rain雨雨编程
✍🏻作者简介:持续分享机器学习,爬虫,数据分析
🐋 希望大家多多支持,我们一起进步!
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+
力扣 | 难度 |
---|---|
39. 组合总和 | 🟠 |
40. 组合总和 II | 🟠 |
131. 分割回文串 | 🟠 |
目录
题目描述
给定一个无重复元素的整数数组 candidates
和一个目标整数 target
,任务是找出 candidates
中所有可以使数字和为 target
的不同组合,并以列表形式返回。需要注意的是,candidates
中的同一个数字可以无限制重复被选取,且如果至少一个数字的被选数量不同,则两种组合是不同的。对于给定的输入,保证和为 target
的不同组合数少于 150 个。
思路步骤
-
排序:首先对
candidates
数组进行排序,这样可以避免重复的组合,并且可以提前终止搜索。 -
回溯法:使用回溯法来找出所有可能的组合。回溯法是一种通过递归搜索所有可能情况的方法,当找到一个解时就将其添加到结果中,并在递归返回时撤销上一步操作。
-
终止条件:如果当前路径的和等于
target
,则将当前路径添加到结果中。 -
剪枝:如果当前路径的和已经超过
target
,则终止当前路径的搜索。 -
循环选择:从当前索引开始循环选择数字,如果加上当前数字后和不超过
target
,则继续递归搜索,否则终止循环。
代码实现
import java.util.*;
class Solution {
List<List<Integer>> res = new LinkedList<>();
List<Integer> path = new LinkedList<>();
public List<List<Integer>> combinationSum(int[] candidates, int target) {
// 对候选数组进行排序
Arrays.sort(candidates);
// 从索引 0 开始回溯搜索
backtracking(candidates, target, 0, 0);
return res;
}
public void backtracking(int[] candidates, int targ