您的位置:首页 > Web前端 > JavaScript

[LeetCode][JavaScript]Permutations II

2015-12-01 16:08 741 查看

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]
, and
[2,1,1]
.

https://leetcode.com/problems/permutations-ii/

全排列,入参数组中的数字可能有重复。

第一种做法是接着Permutations,开一个哈希表记录出现过的组合。

/article/7171063.html

/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique2 = function(nums) {
var result = [], visited = {};
getPermute(0);
return result;

function getPermute(index){
if(index === nums.length){
var id = nums.join('#');
if(!visited[id]){
result.push(nums.slice(0));
visited[id] = true;
}
return;
}
for(var i = index; i < nums.length; i++){
switchNum(i, index);
getPermute(index + 1);
switchNum(i, index);
}
}
function switchNum(i, j){
if(i === j) return;
var tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
};


第二种做法是接着Next Permutation,不断求下一个排列直到重复为止。

/article/7171067.html

/**
* @param {number[]} nums
* @return {number[][]}
*/
var permuteUnique = function(nums) {
var res = [nums.slice(0)], numsJSON = JSON.stringify(nums);
while(true){
nextPermutation(nums);
if(numsJSON !== JSON.stringify(nums)){
res.push(nums.slice(0));
}else{
break;
}
}
return res;

function nextPermutation(nums) {
for(var i = nums.length - 1; i > 0 && nums[i] <= nums[i - 1]; i--);
if(i === 0){
reverse(0, nums.length - 1);
return;
}
for(var j = i + 1; j < nums.length && nums[i - 1] < nums[j]; j++);
swap(i - 1, j - 1);
reverse(i, nums.length - 1);
return;

function reverse(start, end){
while(start < end){
swap(start, end);
start++;
end--;
}
}
function swap(i, j){
var tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: