• [LeetCode][JavaScript]Permutations II


    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,开一个哈希表记录出现过的组合。

    http://www.cnblogs.com/Liok3187/p/4986918.html

     1 /**
     2  * @param {number[]} nums
     3  * @return {number[][]}
     4  */
     5 var permuteUnique2 = function(nums) {
     6     var result = [], visited = {};
     7     getPermute(0);
     8     return result;
     9 
    10     function getPermute(index){
    11         if(index === nums.length){
    12             var id = nums.join('#');
    13             if(!visited[id]){
    14                 result.push(nums.slice(0));
    15                 visited[id] = true;
    16             }
    17             return;
    18         }
    19         for(var i = index; i < nums.length; i++){
    20             switchNum(i, index);
    21             getPermute(index + 1);
    22             switchNum(i, index);
    23         }
    24     }
    25     function switchNum(i, j){
    26         if(i === j) return;
    27         var tmp = nums[i];
    28         nums[i] = nums[j];
    29         nums[j] = tmp;
    30     }
    31 };

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

    http://www.cnblogs.com/Liok3187/p/5010337.html

     1 /**
     2  * @param {number[]} nums
     3  * @return {number[][]}
     4  */
     5 var permuteUnique = function(nums) {
     6     var res = [nums.slice(0)], numsJSON = JSON.stringify(nums);
     7     while(true){
     8         nextPermutation(nums);
     9         if(numsJSON !== JSON.stringify(nums)){
    10             res.push(nums.slice(0));
    11         }else{
    12             break;
    13         }
    14     }
    15     return res;
    16 
    17     function nextPermutation(nums) {
    18         for(var i = nums.length - 1; i > 0 && nums[i] <= nums[i - 1]; i--);
    19         if(i === 0){
    20             reverse(0, nums.length - 1);
    21             return;
    22         }
    23         for(var j = i + 1; j < nums.length && nums[i - 1] < nums[j]; j++);
    24         swap(i - 1, j - 1);
    25         reverse(i, nums.length - 1);
    26         return;    
    27         
    28         function reverse(start, end){
    29             while(start < end){
    30                 swap(start, end);
    31                 start++;
    32                 end--;
    33             }
    34         }
    35         function swap(i, j){
    36             var tmp = nums[i];
    37             nums[i] = nums[j];
    38             nums[j] = tmp;
    39         }
    40     }
    41 };
     
  • 相关阅读:
    js array数组检测方式
    js 获取时间戳
    接收二进制流(ArrayBuffer) ,并且显示二进制流图片
    文字小于12px时,设置line-height不居中问题
    设置文字小于12px
    Kafuka面试(整合Kafka两种模式区别)
    secondary namenode 检查点
    MapReduce总结
    Map、Reduce和Job方法总结
    Hadoop 两种环境下的checkpoint机制
  • 原文地址:https://www.cnblogs.com/Liok3187/p/5010410.html
Copyright © 2020-2023  润新知