47. Permutations II 全排列递归

Given a collection of numbers that might contain duplicates, return all possible unique permutations.

For example,
[1,1,2] have the following unique permutations:
[
[1,1,2],
[1,2,1],
[2,1,1]
]

思路:

这道题是之前那道 Permutations 全排列的延伸,由于输入数组有可能出现重复数字,如果按照之前的算法运算,会有重复排列产生,我们要避免重复的产生,在递归函数中要判断前面一个数和当前的数是否相等,如果相等,前面的数必须已经使用了,即对应的visited中的值为1,当前的数字才能使用,否则需要跳过,这样就不会产生重复排列了,代码如下:

 var permute = function(nums) {
            var res = [];
            var out = [];
            var visited = [];
            nums.sort((a,b)=>a-b)
            for (var i = 0; i < nums.length; i++) {
                visited[i] = 0;
            }
            permuteDFS(nums, 0, out, res, visited);
            return res;

            function permuteDFS(nums, pos, out, res, visited) {
                var tmp = out.concat();
                if (pos === nums.length) res.push(tmp);
                else {
                    for (var i = 0; i < nums.length; i++) {
                        if (visited[i] === 0) {
                            if(i>0 && nums[i]===nums[i-1] && visited[i-1]==0) continue;
                            visited[i] = 1;
                            out.push(nums[i]);
                            permuteDFS(nums, pos + 1, out, res, visited);
                            out.pop();
                            visited[i] = 0;
                        }
                    }
                }

            }
        };

你可能感兴趣的:(47. Permutations II 全排列递归)