Leetcode2597:美丽子集的数目

题目描述:

给你一个由正整数组成的数组 nums 和一个 整数 k

如果 nums 的子集中,任意两个整数的绝对差均不等于 k ,则认为该子数组是一个 美丽 子集。

返回数组 nums非空美丽 的子集数目。

nums 的子集定义为:可以经由 nums 删除某些元素(也可能不删除)得到的一个数组。只有在删除元素时选择的索引不同的情况下,两个子集才会被视作是不同的子集。

代码思路:

  1. 初始化变量
    • self.ans 用于存储符合条件的美丽子集数目。
    • l 存储数组 nums 的长度。
  2. 定义递归函数 dfs(n, subset)
    • n 表示当前遍历到 nums 数组的索引。
    • subset 表示当前构建的子集。
  3. 递归终止条件
    • n == l 时,表示已经遍历完整个数组,此时 subset 是一个完整的子集。由于题目要求非空子集,所以在遍历结束后,将 self.ans 加一(注意,最后返回结果时需要减去一个空集的情况)。
  4. 递归逻辑
    • 检查当前元素 nums[n] 是否可以加入到 subset 中而不破坏美丽子集的条件。这通过判断 nums[n] - knums[n] + k 是否都不在 subset 中来实现。
      • 如果可以加入,那么递归调用 dfs(n+1, subset+[nums[n]]),即把 nums[n] 加入到当前子集,并继续遍历下一个元素。
      • 不论 nums[n] 是否加入当前子集,都需要递归调用 dfs(n+1, subset),即不加入 nums[n],继续遍历下一个元素。这是为了探索所有可能的子集组合。
  5. 启动深度优先搜索
    • 从索引 0 开始,空集 [] 作为初始子集,调用 dfs(0, [])
  6. 返回结果
    • 最后返回 self.ans - 1,因为我们需要排除空集的情况(题目要求非空子集)。

代码实现:

复制代码
class Solution:
    def beautifulSubsets(self, nums: List[int], k: int) -> int:
        self.ans = 0
        l = len(nums)
        def dfs(n,subset):
            if n==l:
               
                self.ans+=1
                return 
            if nums[n]-k not in subset and nums[n]+k not in subset:
                dfs(n+1,subset+[nums[n]])
            dfs(n+1,subset)
        dfs(0,[])    
        return self.ans-1
相关推荐
Coovally AI模型快速验证1 小时前
当视觉语言模型接收到相互矛盾的信息时,它会相信哪个信号?
人工智能·深度学习·算法·机器学习·目标跟踪·语言模型
电院工程师2 小时前
SIMON64/128算法Verilog流水线实现(附Python实现)
python·嵌入式硬件·算法·密码学
轮到我狗叫了2 小时前
力扣.84柱状图中最大矩形 力扣.134加油站牛客.abb(hard 动态规划+哈希表)牛客.哈夫曼编码
算法·leetcode·职场和发展
丛雨要玩游戏2 小时前
字符函数和字符串函数
c语言·开发语言·算法
八个程序员2 小时前
自定义函数(C++)
开发语言·c++·算法
ad钙奶长高高2 小时前
【C语言】初始C语言
c语言·开发语言·算法
罗西的思考2 小时前
【Agent】 ACE(Agentic Context Engineering)源码阅读笔记---(3)关键创新
人工智能·算法
报错小能手3 小时前
C++笔记(面向对象)静态联编和动态联编
开发语言·c++·算法
WBluuue3 小时前
AtCoder Beginner Contest 430(ABCDEF)
c++·算法
小肖爱笑不爱笑3 小时前
2025/11/5 IO流(字节流、字符流、字节缓冲流、字符缓冲流) 计算机存储规则(ASCII、GBK、Unicode)
java·开发语言·算法