/** 暴力法 */
var specialPerm = function(nums) {
const len = nums.length;
const dfs = function(u,i){
if(u === 0) return 1;//空集,说明能走到最后
let res = 0;
for(let j = 0; j < len; j++){
if(u&(1<<j) && (nums[i]%nums[j]===0||nums[j]%nums[i]===0)){
res+=dfs(u^(1<<j),j);
}
}
return res;
}
let res = 0;
for(let i = 0; i < len; i++){
res += dfs(((1<<len)-1)^(1<<i),i);
}
return res % (10**9 + 7);
};
递归 + 哈希表 = 记忆化搜索
/** 递归 + 哈希表 = 记忆化搜索 */
var specialPerm = function(nums) {
const len = nums.length;
const map = new Map();
const dfs = function(u,i){
if(u === 0) return 1;//空集,说明能走到最后
if(map.has(u+"#"+i)) return map.get(u+"#"+i)
let res = 0;
for(let j = 0; j < len; j++){
if(u&(1<<j) && (nums[i]%nums[j]===0||nums[j]%nums[i]===0)){
res+=dfs(u^(1<<j),j);
}
}
map.set(u+"#"+i,res);
return res;
}
let res = 0;
for(let i = 0; i < len; i++){
res += dfs(((1<<len)-1)^(1<<i),i);
}
return res % (10**9 + 7);
};
作者:__sgf__
链接:https://leetcode.cn/problems/special-permutations/solutions/
来源:力扣(LeetCode)