LeetCode 40 组合总和2

给出两种去重的方法,其中第二种为官方方法,官方采用对每个值进行计数的方式去重。

class Solution:
    def __init__(self):
        self.res=[]

    '''
    去重的最好方法就是每一轮循环每个相同的元素只遍历一次
    '''
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        candidates.sort()
        for i in range(0,len(candidates)):
            if i>0 and candidates[i]==candidates[i-1]:
                continue
            self.back(candidates,[],i,target)
        return self.res

    def back(self,candidates,tem_path,idx,remain):
        if candidates[idx]==remain:
            path=tem_path[:]
            path.append(candidates[idx])
            self.res.append(path)
            return
        remain-=candidates[idx]
        tem_path.append(candidates[idx])
        for i in range(idx+1,len(candidates)):
            if i>idx+1 and candidates[i]==candidates[i-1]:
                continue
            if candidates[i]<=remain:
                self.back(candidates,tem_path,i,remain)
            else:
                break
        remain+=candidates[idx]
        tem_path.pop()
class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        def dfs(idx: int, rest: int):
            nonlocal sequence
            if rest == 0:
                ans.append(sequence[:])
                return
            if idx == len(freq) or rest < freq[idx][0]:
                return
            dfs(idx + 1, rest)

            # 最多可选的个数
            most = min(rest // freq[idx][0], freq[idx][1])
            for i in range(1, most + 1):
                sequence.append(freq[idx][0])
                dfs(idx + 1, rest - i * freq[idx][0])
            sequence = sequence[:-most]

        freq = sorted(Counter(candidates).items())
        ans, sequence = [], []
        dfs(0, target)
        return ans
from typing import *


class Solution:
    def __init__(self):
        self.res = []
        self.visited = None

    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        self.visited = [False] * len(candidates)
        candidates.sort()
        self.back(candidates, [], 0, target)
        return self.res

    def back(self, candidates, tem_list, tem_sum, target):
        if tem_sum == target:
            self.res.append(tem_list[:])
            return
        for i in range(len(candidates)):
            # 选择一个要添加的元素
            if self.visited[i] or tem_sum + candidates[i] > target or (
                    i > 0 and candidates[i] == candidates[i - 1] and not self.visited[i - 1]) or (
                    len(tem_list) > 0 and candidates[i] < tem_list[-1]):
                continue
            tem_list.append(candidates[i])
            self.visited[i] = True
            self.back(candidates, tem_list, tem_sum + candidates[i], target)
            self.visited[i] = False
            tem_list.pop()

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值