题目描述:
给你一个由正整数组成的数组 nums
和一个 正 整数 k
。
如果 nums
的子集中,任意两个整数的绝对差均不等于 k
,则认为该子数组是一个 美丽 子集。
返回数组 nums
中 非空 且 美丽 的子集数目。
nums
的子集定义为:可以经由 nums
删除某些元素(也可能不删除)得到的一个数组。只有在删除元素时选择的索引不同的情况下,两个子集才会被视作是不同的子集。
代码思路:
- 初始化变量 :
self.ans
用于存储符合条件的美丽子集数目。l
存储数组nums
的长度。
- 定义递归函数
dfs(n, subset)
:n
表示当前遍历到nums
数组的索引。subset
表示当前构建的子集。
- 递归终止条件 :
- 当
n == l
时,表示已经遍历完整个数组,此时subset
是一个完整的子集。由于题目要求非空子集,所以在遍历结束后,将self.ans
加一(注意,最后返回结果时需要减去一个空集的情况)。
- 当
- 递归逻辑 :
- 检查当前元素
nums[n]
是否可以加入到subset
中而不破坏美丽子集的条件。这通过判断nums[n] - k
和nums[n] + k
是否都不在subset
中来实现。- 如果可以加入,那么递归调用
dfs(n+1, subset+[nums[n]])
,即把nums[n]
加入到当前子集,并继续遍历下一个元素。 - 不论
nums[n]
是否加入当前子集,都需要递归调用dfs(n+1, subset)
,即不加入nums[n]
,继续遍历下一个元素。这是为了探索所有可能的子集组合。
- 如果可以加入,那么递归调用
- 检查当前元素
- 启动深度优先搜索 :
- 从索引
0
开始,空集[]
作为初始子集,调用dfs(0, [])
。
- 从索引
- 返回结果 :
- 最后返回
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