问题:给定一个无重复元素的数组nums和一个目标数sum,输出所有使数字和为目标数的组合。
解题思路:
(1)将nums进行降序排序,例如nums=[6,5,3,2]。这样,如果和已经大于9就不需要再考虑后面的数字了。例如,6+5>9,所以可以直接排除[6,5,3],[6,5,2],[6,5,3,2]和[6,5]这些选项。
(2)设一个变量为当前和,再设res数组用来存当前题解。
(3)遍历nums数组:
① 如果当前数字加上当前和小于目标数,就按顺序继续再加一个数字。
② 如果当前数字加上当前和等于目标数,就将当前组合加入res。
③ 如果当前数字加上当前和大于目标数,就放弃当前数字,换成下一个数字。如果当前数字之后的所有数字都太大,就返回到当前数字之前的那个数字,放弃它,换成下一个数字,再重复以上步骤。
代码:
# 在nums中找到所有使和为sum的组合
def combinationSum(nums, sum):
# 在nums的剩余数字中找到所有使和为num-cursum的组合
# 每次只选择一个数字
# cursum为当前和,solution为当前解,index为剩余数字的开始坐标
def helper(curSum, solution, index):
if curSum > sum: # 当前和大于目标和
return
if curSum == sum: # 当前和等于目标和
res.append(solution)
return
for i in range(index, n): # 当前和小于目标和
helper(curSum + nums[i], solution + [nums[i]], i)
n = len(nums)
nums.sort(reverse=True) # 将数组排序
res = []
helper(0, [], 0)
return res
输入:
输出: