由leetcode39. 组合总和看搜索去重问题 & 搜索排列组合
今天一刷随想录,把组合一起做完了,有一些个人的想法,顺便好像是也思考到了排列,因为还没做排列题等做完排列再来修改这篇文章。
先来看一下lc39
题目
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
开始我的错误想法,既然元素都可以重复,那么在横向的时候只要每次都从数组的最前面开始就好了(即没有index——把相同数组视为不同数组)
展示下错误代码
void backtracking(int[] candidates, int sum){
if(sum < 0) return;
if(sum == 0){
res.add(new ArrayList(path));
return;
}
for(int i = 0; i < candidates.length; i ++){
// 剪枝
if(candidates[i] > sum) continue;
path.add(candidates[i]);
backtracking(candidates, sum - candidates[i]);
path.remove(path.size() - 1);
}
}
得到结果如下
我意识到这是排列,而不是组合,可是为什么横向使用重复数字不能达到题目的效果呢?
首先画出我的搜索树<