Leetcode题库——40.组合总和II


@author: ZZQ
@software: PyCharm
@file: combinationSum2.py
@time: 2018/11/15 18:38
要求:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。
说明:
所有数字(包括目标数)都是正整数。
解集不能包含重复的组合。
示例 1:
输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
[1, 7],
[1, 2, 5],
[2, 6],
[1, 1, 6]
]
示例 2:
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
[1,2,2],
[5]
]
思路; 深搜+ 减枝
注意停止: 如果当前temp_ans > target, 则停止, return
注意每个元素只能使用一次, 先对数组进行排序,然后每次深搜都从下一个元素开始。
注意拷贝temp_ans到新的数组中,再存入ans中。

import copy
class Solution():
    def __init__(self):
        pass

    def combinationSum2(self, candidates, target):
        """
        :type candidates: List[int]
        :type target: int
        :rtype: List[List[int]]
        """
        candidates.sort()
        can_len = len(candidates)
        if can_len == 0:
            return []
        ans = []
        temp_ans = []
        temp_sum = 0
        start_index = -1
        self.dfs(temp_ans, temp_sum, start_index, target, candidates, ans)
        return ans

    def dfs(self, temp_ans, temp_sum, start_index, target, candidates, ans):
        if temp_sum == target:
            tt_ans = copy.deepcopy(temp_ans)
            ans.append(tt_ans)
            return
        if temp_sum > target:
            return
        for i in range(start_index+1, len(candidates)):
            if i > start_index+1 and candidates[i] == candidates[i-1]:
                continue
            temp_ans.append(candidates[i])
            self.dfs(temp_ans, temp_sum + candidates[i], i, target, candidates, ans)
            temp_ans.pop()
posted @ 2018-11-15 19:41  恩zzq我是  阅读(104)  评论(0编辑  收藏  举报