leetcode 刷题之路 56 Subsets (非递归解法)
来源:互联网 发布:oracle sql调优技巧 编辑:程序博客网 时间:2024/06/05 18:09
Given a set of distinct integers, S, 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 S = [1,2,3]
, a solution is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]
Given a set of distinct integers, S, return all possible subsets.
这道题采用递归方式比较方便,具体可以参考网上其他人给出的答案。
这里我采用非递归方式完成这道题。
若S大小为n,构造一个大小为n+1的位图,0~n-1位为0或者1分别表示S中对应数字加入或者不加入集合两种情况,共有2^n中情况,位图从0开始递增1,每个位图值就对应一种可能的情况,根据位图值选取集合中的数字就构成一种可能情况加入到最终结果中。当位图的第n位为1时,表示所有可能情况都取到了,程序结束。
算法的复杂度较递归算法没有提升,这里只是提供另外一种思路。
AC code:
class Solution {public:vector<vector<int> > subsets(vector<int> &S){vector<vector<int>>ret;int n = S.size();if (n == 0)return ret;int int_size = sizeof(int)* 8;int *flag = new int[(n + 1) / int_size + 1];//多分配了一个1bit大小,方便做结束判断memset(flag, 0, ((n + 1) / int_size + 1)*sizeof(int));vector<int> temp;while ((flag[(n + 1) / int_size] & (1 << n % int_size)) == 0){temp.clear();for (int i = 0; i < n; i++){if ((flag[i / int_size] & (1 << i%int_size)) != 0)temp.push_back(S[i]);}sort(temp.begin(), temp.end());ret.push_back(temp);int j = 0;while (1)//加1操作{if (flag[j] != INT_MAX){++flag[j];break;}elseflag[j++] = 0;}}return ret;}};
0 0
- leetcode 刷题之路 56 Subsets (非递归解法)
- LeetCode之maxDepth非递归解法
- 二叉树之遍历(递归和非递归解法)
- leetcode 刷题之路 57 Subsets II
- Leetcode Symmetric Tree 递归和非递归解法
- leetcode:path sum(I) 递归与非递归解法
- 汉若塔游戏非递归解法(c#)
- 背包问题(非递归解法)
- 背包非递归解法
- Fibonacci非递归解法
- leetcode:N-Queens II 的位运算非递归解法
- 汉诺塔问题的递归解法与非递归解法(堆栈解法)
- 每天刷个算法题20160523:骑士巡游的递归转非递归解法
- 每天刷个算法题20160524:阿克曼函数的递归转非递归解法
- 每天刷个算法题20160525:快速排序的递归转非递归解法
- 【(伪)递归】HDU1997 - 汉诺塔VII(非递归解法)
- 全排列(含递归和非递归的解法)
- 全排列(含递归和非递归的解法)
- 输出01背包内物品的程序
- ios开源类库收集
- android跨进程事件注入(程序模拟用户输入)
- 二十二:微信公众帐号开发-符号表情的发送(下)
- 播放器 倒计时 闹钟 日期 分秒 时间算法
- leetcode 刷题之路 56 Subsets (非递归解法)
- 14、B树、B+树的概念及用途
- android应用开发中的图片缓存系统
- krpano 教程 - display 标签中文说明
- 【ORACLE】AWR报告的生成和简单分析方法
- 新浪 ip 地址库
- hdu-2814-Interesting Fibonacci-斐波那契循环节
- 关于 xcode5 每次修改代码,都要先clean,重新编译才有效的解决方法汇总
- 获取任务栏所有正在运行程序