標籤:
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], []]
全排列。
首先是非遞迴的巧妙解法。
比如題目中的例子[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 if(a > b){30 return 1;31 }else if(a < b){32 return -1;33 }else{34 return 0;35 }36 }37 };
效率很高。
常規的遞迴解法。
比較難以描述,舉栗子[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 if(a > b){32 return 1;33 }else if(a < b){34 return -1;35 }else{36 return 0;37 }38 }39 }
[LeetCode][JavaScript]Subsets