Description

Given a set of candidate numbers (candidates) (without duplicates) and a target number (target), find all unique combinations in candidates where the candidate numbers sums to target.

The same repeated number may be chosen from candidates unlimited number of times.

Note:

All numbers (including target) will be positive integers.
The solution set must not contain duplicate combinations.
Example 1:

Input: candidates = [2,3,6,7], target = 7,A solution set is:[  [7],  [2,2,3]]

Example 2:

Input: candidates = [2,3,5], target = 8,A solution set is:[  [2,2,2,2],  [2,3,3],  [3,5]]

描述

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

candidates 中的数字可以无限制重复被选取。

说明:

所有数字(包括 target)都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: candidates = [2,3,6,7], target = 7,所求解集为:[  [7],  [2,2,3]]

示例 2:

输入: candidates = [2,3,5], target = 8,所求解集为:[  [2,2,2,2],  [2,3,3],  [3,5]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

  • 使用深度优先搜索,进行遍历。如果路径的和为 target ,就此路径的值添加到结果数组中。
  • 为了表示路径和为 target,我们将每次的 target 减去当前遍历的元素,那么当 target 为 0 时遍历走过的路径就时题意所求。
  • 首先对给定的数组进行排序,由于元素可以被重复使用,所以下一次遍历的开始位置为当前位置 i,而不是 i +1。
  • 由于数组已经排序,所以如果当前元素大于 target,那么可以直接返回。
  • 结束条件为 targe 为 0。
# -*- coding: utf-8 -*-# @Author:             何睿# @Create Date:        2018-11-28 18:20:58# @Last Modified by:   何睿# @Last Modified time: 2019-08-18 07:11:56from typing import Listclass Solution:    def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:        res = []        candidates.sort()        self.dfs(candidates, target, 0, [], res)        return res    def dfs(self, candidates, target, index, path, res):        if target == 0:            res.append(list(path))        for i in range(index, len(candidates)):            if candidates[i] > target:                return            path.append(candidates[i])            self.dfs(candidates, target - candidates[i], i, path, res)            path.pop()

源代码文件在 这里 。
©本文是原创文章,欢迎转载,转载需保留 文章来源 ,作者信息和本声明.