小黑今天实习请假,做笔试,做完去搓澡去了的leetcode之旅:剑指 Offer II 084. 含有重复元素集合的全排列&&剑指 Offer II 082. 含有重复元素集合的组合

该文主要介绍了两个使用Python解决的算法问题,包括含有重复元素集合的全排列和组合。通过排序和回溯法,有效地避免了重复并找到所有可能的解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

剑指 Offer II 084. 含有重复元素集合的全排列

小黑代码

class Solution:
    def permuteUnique(self, nums: List[int]) -> List[List[int]]:
        # 结果数组与中间变量
        results = []
        res = []
        # 对数组进行排序,便于回溯
        nums = sorted(nums)
        # 数组长度
        n = len(nums)
        # 访问数组
        flags = [False] * n
        # 回溯函数
        def dfs(i = 0):
            # 递归出口
            if i == n:
                results.append(res[:])
                return
            for j in range(n):
                # 判断该元素是否被访问
                if flags[j]:
                    continue
                # 如果紧邻两个元素相同,判断上一个是否被使用过,如果未被使用,证明该位置已经放过该元素
                if j > 0 and nums[j-1]==nums[j] and not flags[j-1]:
                    continue
                res.append(nums[j])
                flags[j] = True
                dfs(i + 1)
                res.pop()
                flags[j] = False

        dfs()
        return results

在这里插入图片描述

剑指 Offer II 082. 含有重复元素集合的组合

小黑代码

class Solution:
    def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]:
        # 对数组中的每个元素进行计次,按照元素大小排序
        items = list(collections.Counter(candidates).items())
        items.sort(key = lambda x:x[0])
        # 集合的长度
        n = len(items)
        # 结果数组与中间变量
        results = []
        res = []
        self.sum = 0
        # 回溯函数
        def dfs(i = 0):
            if self.sum == target:
                results.append(res[:])
                return
            if i == n:
                return
            if self.sum + items[i][0] <= target:
                count = min((target - self.sum) // items[i][0], items[i][1])
                # 分别列举每个次数
                for _ in range(count):
                    res.append(items[i][0])
                    self.sum += items[i][0]
                    dfs(i + 1)
                # 回溯
                for _ in range(count):
                    res.pop()
                    self.sum -= items[i][0]
            # 不存放该元素的情况
            dfs(i + 1)
        dfs()
        return results

在这里插入图片描述

小黑生活

晚饭板面

在这里插入图片描述

回去完练琴拍拍辅导员

在这里插入图片描述

睡前吃个牛排

在这里插入图片描述

早上笔试两小时

在这里插入图片描述

中午继续吃牛排

在这里插入图片描述
在这里插入图片描述

吃完去永定门外搓个澡汗个蒸

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

焦急地看着工作信息

在这里插入图片描述

不去和别人比,加油!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值