力扣每日一题——2597. 美丽子集的数目
给你一个由正整数组成的数组 nums
和一个 正 整数 k
。
如果 nums
的子集中,任意两个整数的绝对差均不等于 k
,则认为该子数组是一个 美丽 子集。
返回数组 nums
中 非空 且 美丽 的子集数目。
nums
的子集定义为:可以经由 nums
删除某些元素(也可能不删除)得到的一个数组。只有在删除元素时选择的索引不同的情况下,两个子集才会被视作是不同的子集。
示例 1:
输入:nums = [2,4,6], k = 2 输出:4 解释:数组 nums 中的美丽子集有:[2], [4], [6], [2, 6] 。 可以证明数组 [2,4,6] 中只存在 4 个美丽子集。
示例 2:
输入:nums = [1], k = 1 输出:1 解释:数组 nums 中的美丽数组有:[1] 。 可以证明数组 [1] 中只存在 1 个美丽子集。
提示:
1 <= nums.length <= 18
1 <= nums[i], k <= 1000
方法一:暴力法递归
class Solution {
private int res;
public int beautifulSubsets(int[] nums, int k) {
//判断入参
int length = nums.length;
if (length == 0 || length == 1) return length;
dg(nums,k,0,new HashMap<Integer,Integer>());
return res;
}
private void dg(int[] nums, int k, int index, HashMap<Integer, Integer> map) {
//递归结束条件
if (index == nums.length) {
return;
}
//检查当前元素是否可以加入
if (!map.values().contains(nums[index] - k) && !map.values().contains(nums[index] + k)){
//放入元素
map.put(index,nums[index]);
//记录结果
res++;
dg(nums, k, index + 1, map);
//拿出元素
map.remove(index);
}
//不放入的情况
dg(nums, k, index + 1, map);
}
}
结果:
原题链接:
2597. 美丽子集的数目 - 力扣(LeetCode)
这个题最优的写法应该是动态规划,这里感兴趣的可以去看一下那个写法