leetcode新年病房暴乱康复计划 46 / 47. 全排列 JS解法
//46
/** * @param {number[]} nums * @return {number[][]} */ var permute = function(nums) { var ans = []; var vis = []; var res = []; var len = nums.length; function dfs(step){ if(step === len){ ans.push([...res]); return; } for(var i = 0; i < len; i++){ if(!vis[nums[i]]){ vis[nums[i]] = 1; res.push(nums[i]); dfs(step + 1); res.pop(); vis[nums[i]] = 0; } } } dfs(0); return ans; };
46这题经典dfs模板 有手就行 发出来主要是发现js数组类型的length调用时不太划算,需要使用多次时最好拉出来复制一下,这题没设len前运行时间为104ms,优化后80ms
//47
/** * @param {number[]} nums * @return {number[][]} */ var permuteUnique = function(nums) { var ans = []; var vis = []; var res = []; var len = nums.length; nums.sort((a,b) => {return a - b}); nums.forEach(v => {if(!vis[v])vis[v] = 0;vis[v]++;}); function dfs(step){ if(step === len){ ans.push([...res]); return; } var len1 = nums.length; for(var i = 0; i < len1; i++){ if(i > 0 && nums[i] == nums[i - 1])continue; if(vis[nums[i]]){ vis[nums[i]]--; res.push(nums[i]); dfs(step + 1); res.pop(); vis[nums[i]]++; } } } dfs(0); return ans; };
47这题如果单纯的使用46题方法则非常耽误时间 这里改用vis储存次数来进行对重复情况的剪枝 另外用排序优化排除掉同一前缀下同一位置同一数字的情况

浙公网安备 33010602011771号