回溯part 04

LC 90 子集Ⅱ

补昨天的一道,顺便练练手,思路与LC40一致

class Solution:
    def back_track(self, nums , index = 0):
        self.res.append(self.path[:])
        if index > len(nums):
            return
        for i in range(index , len(nums)):
            if i > index and self.used[i - 1] == 0 and nums[i] == nums[i-1]:
                continue
            self.path.append(nums[i])
            self.used[i] = 1
            self.back_track(nums , i + 1)
            self.path.pop()
            self.used[i] = 0
        return self.res

    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.path = []
        self.res = []
        self.used = [0] * len(nums)
        nums.sort()
        return self.back_track(nums)

LC 491 递增子序列

又巩固了几个知识点:

1,数层去重:本题在for循环前用set记录已使用的数字,后面就不能以这个集合里的数字作为根节点了

2,取数逻辑:求取结果在树的节点上的情形(子集的情形),一进递归就要收集符合要求的结果,这样才不会漏

class Solution:
    def back_track(self , nums ,index):
        if len(self.path[:]) >= 2:
            self.res.append(self.path[:])

        used = set()
        for i in range(index , len(nums)):
            if (self.path and nums[i] < self.path[-1]) or nums[i] in used:
                continue
            self.path.append(nums[i])
            used.add(nums[i])
            self.back_track(nums , i+1)
            self.path.pop()
        return self.res
            


    def findSubsequences(self, nums: List[int]) -> List[List[int]]:
        self.path = []
        self.res = []
        return self.back_track(nums , 0)

LC 46 全排列

比较简单,used数组记录下用过的元素即可,for循环从0开始,和排列不一样

class Solution:
    def back_track(self, nums , used):
        if len(self.path) == len(nums):
            self.res.append(self.path[:])
        for i in range( 0 , len(nums)):
            if used[i] == 1:
                continue
            self.path.append(nums[i])
            used[i] = 1
            self.back_track(nums,used)
            self.path.pop()
            used[i] = 0
        return self.res
    def permute(self, nums: List[int]) -> List[List[int]]:
        self.path = []
        self.res = []
        return self.back_track(nums,[0]*len(nums))

LC 47 全排列Ⅱ

本题给我的启发:数层去重和树枝去重的逻辑都可以靠一个used数组来实现

class Solution:
    def back_track(self , nums , used):
        if len(self.path) == len(nums):
            self.res.append(self.path[:])
            return
        for i in range(len(nums)):
            if(i>0 and nums[i-1] == nums[i] and used[i-1] == 0) or used[i] == 1:
                continue
            self.path.append(nums[i])
            used[i] = 1
            self.back_track(nums , used)
            self.path.pop()
            used[i] = 0
        return self.res
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        self.path = []
        self.res = []
        used = [0] * len(nums)
        nums.sort()
        return self.back_track(nums, used)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值