思路:和39题的区别是,不能重复调用给定的元素自身,和上一题的相同点是,都不可以有重复解
回溯法最主要的两点,一点是类似于递归,如果符合当前条件就继续继续进行下去,如果不符合则终止,跳到上一循环,
同时对这一循环中的某些已经改变的量还原。
这题为了避免重复调用某个元素,需要做一个判断,
如目标list:[1,2,2,2,5] , target = 5
若1,2,2(前两个2)已经实现,返回上一循环[1,2], 不需要再调用第三个2,直接进行第5这个元素判断是某满足要求。
ref:https://leetcode-cn.com/problems/combination-sum-ii/solution/hui-su-jian-zhi-zhu-xing-jie-shi-python3-by-zhu_sh/
回溯法+排序剪枝
特判,若candidatescandidates为空,则返回[][]
回溯函数helper()helper(),传入参数:下一加和索引ii,当前已加和数组tmptmp,下一目标targettarget
若target0target0,说明当前和满足条件,将当前加和数组tmptmp加入resres,并return。
剪枝 因为已经将candidatescandidates排序,所以当下一目标小于下一待加和数时,return。并且当下一待加和索引inin时,return。为了防止数组越界,将条件inin放在target<candidates[i]target<candidates[i]之前