• [LeetCode][JavaScript]Subsets


    Subsets

    Given a set of distinct integers, nums, return all possible subsets.

    Note:

    • Elements in a subset must be in non-descending order.
    • The solution set must not contain duplicate subsets.

    For example,
    If nums = [1,2,3], a solution is:

    [
      [3],
      [1],
      [2],
      [1,2,3],
      [1,3],
      [2,3],
      [1,2],
      []
    ]

    https://leetcode.com/problems/subsets/


    全排列。

    首先是非递归的巧妙解法。

    比如题目中的例子[1,2,3]:

    一共有8种情况,如果用三位的二进制表示,1代表选,0代表不选,正好就是000到111。

    代码中的padLeft方法把当前的数转化成长度等于nums.length的二进制字符串,位数不足以0补齐。

     1 /**
     2  * @param {number[]} nums
     3  * @return {number[][]}
     4  */
     5 var subsets = function(nums) {
     6     nums = nums.sort(sorting);
     7     var res = [];
     8     for(var i = 0; i < Math.pow(2, nums.length); i++){
     9         var str = padLeft(i, nums.length);
    10         var tmp = [];
    11         for(var j = 0; j < str.length; j++){
    12             if(str[j] === '1'){
    13                 tmp.push(nums[j]);
    14             }
    15         }
    16         res.push(tmp);
    17     }
    18     return res;
    19     
    20     function padLeft(num, len){
    21         var res = "", i = len;
    22         while(i--) res += '0';
    23         var tmp = parseInt(num).toString(2);
    24         res = res + tmp;
    25         return res.substring(tmp.length, res.length);
    26     }
    27 
    28     function sorting(a, b){
    29         return a - b;
    30     }
    31 };

    效率很高。

    常规的递归解法。

    比较难以描述,举栗子[1,2,3,4]

    当递归到[1,2]的时候,下一轮的递归是[1,2,3]和[1,2,4]。

    [1,2,3]又会递归到[1,2,3,4]。

    当递归到[1,3]的时候,下一轮的递归是[1,3,4]。

    以此类推。

     1 /**
     2  * @param {number[]} nums
     3  * @return {number[][]}
     4  */
     5 var subsets = function(nums) {
     6     nums = nums.sort(sorting);
     7     var res = [[]], arr = [];
     8     for(var i = 0; i < nums.length; i++){
     9         res.push([nums[i]]);
    10         arr.push({val : [nums[i]], pos : i});
    11     }
    12     getSets(arr);
    13     return res;
    14 
    15     function getSets(arr){
    16         var i, j, tmp, nextArr = [];
    17         for(i = 0; i < arr.length; i++){
    18             for(j = arr[i].pos + 1; j < nums.length; j++){
    19                 tmp = arr[i].val.slice(0);
    20                 tmp.push(nums[j]);
    21                 res.push(tmp);
    22                 nextArr.push({val : tmp, pos : j});
    23             }
    24         }
    25         if(nextArr.length > 0){
    26             getSets(nextArr);
    27         }
    28     }
    29 
    30     function sorting(a, b){
    31         return a - b;
    32     }
    33 }
  • 相关阅读:
    虚拟机中Linux 下安装tools
    各个复位标志解析,让我们对MCU的程序的健康更有把控
    用过的两种鼠标右键添加快捷指令方法
    一个ftp协议传输文件之后执行脚本无法工作的情况
    一文入门Linux下gdb调试(二)
    一文入门Linux下gdb调试(一)
    VS CODE远程办公篇一
    Kwp2000协议的应用(程序后续篇)
    Kwp2000协议的应用(程序原理篇)
    Kwp2000协议的应用(硬件原理使用篇)
  • 原文地址:https://www.cnblogs.com/Liok3187/p/4733079.html
Copyright © 2020-2023  润新知