leetcode笔记:Subsets
来源:互联网 发布:白百合离婚 知乎 编辑:程序博客网 时间:2024/06/05 19:50
一. 题目描述
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], []]
二. 题目分析
该题的大意是,给定一个集合,求出这个集合所有的子集(所谓子集,就是包含原集合中的一部分元素的集合)。可使用DFS递归嵌套。总共N
层,时间复杂度为O(2^N)
。我的做法是使用位运算,一个含有N
个元素的数组有2^N
个子集,因此该题目可转换为求数组的元素组合。使用一个N
位二进制位表示数组nums
的各下标出现与否,当某一位为1
表示这次组合中出现当前下标所对应的元素,否则表示不选择当前下标元素,时间复杂度也是O(2^N)
。
三. 示例代码
// 方法一,位运算class Solution {public: vector<vector<int>> subsets(vector<int>& nums) { sort(nums.begin(), nums.end()); int n = nums.size(); int MAX = 1 << n; vector<vector<int>> result; for (int i = 0; i < MAX; ++i) { vector<int> temp; int index = 0; int j = i; while (j > 0) { if (j & 1) // 二进制数的最低位为1,表示该位出现在此次排列中 temp.push_back(nums[index]); j = j >> 1; // 一次次移位,判断各位上是否为1 ++index; // nums的下标逐次加1 } result.push_back(temp); } return result; }};
// 方法二,DFS#include <iostream>#include <vector>#include <algorithm>using namespace std;class Solution {public: vector<vector<int> > result; vector<int> temp; vector<vector<int>> subsets(vector<int>& nums) { if(nums.empty()) return result; sort(nums.begin(), nums.end()); dfs(0, temp, nums); return result; }private: void dfs(int k, vector<int> temp, vector<int> nums){ result.push_back(temp); for(int i = k; i < nums.size(); ++i){ temp.push_back(nums[i]); dfs(i + 1, temp, nums); temp.pop_back(); } }};
四. 小结
就提交结果来看,似乎还有更快的算法。
4 0
- leetcode笔记:Subsets
- leetcode笔记:Subsets II
- leetcode学习笔记:Combinations & Subsets
- 【LeetCode】 Subsets Subsets II
- 【LeetCode】Subsets & Subsets II
- LeetCode Subsets && Subsets II
- LeetCode Subsets && Subsets II
- LeetCode-Subsets & Subsets II
- LeetCode: Subsets
- LeetCode Subsets
- [Leetcode] Subsets
- LeetCode : Subsets
- [LeetCode] Subsets
- Leetcode: Subsets
- Leetcode: Subsets ||
- [leetcode] subsets
- Leetcode - Subsets
- [LeetCode]Subsets
- [iOS]图片添加文字或者水印
- Day-5 周六,看JS
- login.sql 和临时表的一些概念
- [leetcode 136] Single Number
- 浅析结构体函数指针与内核设备驱动
- leetcode笔记:Subsets
- 软件设计模式
- python+正则表达式获取ed2k url
- Android中Activity之间数据传递及返回
- ioctl() 函数用法
- Linux中查看文本文件内容命令cat/tac/nl/more/less/head/tail/vi总结
- Android-Selector实现EditText点击转变风格
- 数据库
- [Python标准库]copy——复制对象