【回溯 + 剪枝】因为n只有20,所以回溯枚举子集的复杂度只有2 ^ 20,也就1e6,所以检查字符串时复杂度低于100即可。这里可以用哈希表来记录已经用过的数字,如果当前放入的数字 - 2 或者 + 2 的值不在哈希表中才能放。
class Solution {
int n, ans = -1, k;
int[] nums;
Set<Integer>set = new HashSet();
void dfs(int t) {
if (t == n) {
ans++;
return;
}
dfs(t + 1);
if (!set.contains(nums[t] - k) && !set.contains(nums[t] + k)) {
set.add(nums[t]);
dfs(t + 1);
set.remove(nums[t]);
}
}
public int beautifulSubsets(int[] nums, int k) {
this.nums = nums;
this.k = k;
n = nums.length;
dfs(0);
return ans;
}
}