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 }