[LeetCode][JavaScript]Subsets
2015-08-15 20:48
645 查看
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补齐。
/** * @param {number[]} nums * @return {number[][]} */ var subsets = function(nums) { nums = nums.sort(sorting); var res = []; for(var i = 0; i < Math.pow(2, nums.length); i++){ var str = padLeft(i, nums.length); var tmp = []; for(var j = 0; j < str.length; j++){ if(str[j] === '1'){ tmp.push(nums[j]); } } res.push(tmp); } return res; function padLeft(num, len){ var res = "", i = len; while(i--) res += '0'; var tmp = parseInt(num).toString(2); res = res + tmp; return res.substring(tmp.length, res.length); } function sorting(a, b){ return a - b; } };
效率很高。
常规的递归解法。
比较难以描述,举栗子[1,2,3,4]
当递归到[1,2]的时候,下一轮的递归是[1,2,3]和[1,2,4]。
[1,2,3]又会递归到[1,2,3,4]。
当递归到[1,3]的时候,下一轮的递归是[1,3,4]。
以此类推。
/** * @param {number[]} nums * @return {number[][]} */ var subsets = function(nums) { nums = nums.sort(sorting); var res = [[]], arr = []; for(var i = 0; i < nums.length; i++){ res.push([nums[i]]); arr.push({val : [nums[i]], pos : i}); } getSets(arr); return res; function getSets(arr){ var i, j, tmp, nextArr = []; for(i = 0; i < arr.length; i++){ for(j = arr[i].pos + 1; j < nums.length; j++){ tmp = arr[i].val.slice(0); tmp.push(nums[j]); res.push(tmp); nextArr.push({val : tmp, pos : j}); } } if(nextArr.length > 0){ getSets(nextArr); } } function sorting(a, b){ return a - b; } }
相关文章推荐
- JavaScript基础学习之-JavaScript权威指南--3.2文本
- javascript实现简单日期下拉选择器
- JS学习十六天----单例模式
- JavaScript基础学习之-JavaScript权威指南--3.1数字
- Top 10:HTML5、JavaScript 3D游戏引擎和框架
- JS学习十五天----设计模式开篇
- JSON数据解析
- 文件管理与XMl、JSON解析
- JavaScript高级程序设计笔记(3)
- JS中!=与==与!==与===的用法和区别
- js时钟翻牌效果实现代码分享
- JavaScript基础学习之-自定义对象(2)
- JavaScript基础学习之-自定义对象(1)
- js实现点击文本框显示日期选择器特效代码分享
- jsp基础学习(六)--jsp传递参数方法
- jsp/servlet相关技术 (四) --- jsp的内置对象(一)
- jsp基础学习(五)----jsp指令
- 用Json实现PHP与JavaScript间数据交换
- jsp基础学习(四)----jsp引擎工作原理
- jsp基础学习(三)----jsp工作原理