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],
[]
]
其实就是Power Set.
Solution 1:
DFS, Recursive
public List<List<Integer>> subsets(int[] S) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(S); getSubsets(result, new ArrayList<Integer>(), S, 0); return result; } private void getSubsets(List<List<Integer>> result, List<Integer> list, int[] S, int start) { result.add(new ArrayList<Integer>(list)); for(int i=start; i<S.length; i++) { list.add(S[i]); getSubsets(result, list, S, i+1); list.remove(list.size()-1); } }
vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; vector<int> list; sort(nums.begin(), nums.end()); function<void(int)> backtrack = [&](int start) { res.push_back(list); for(int i=start; i<nums.size(); i++) { list.push_back(nums[i]); backtrack(i+1); list.pop_back(); } }; backtrack(0); return res; }
Solution 2:
BFS, Iterative.
public List<List<Integer>> subsets(int[] S) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(S); result.add(new ArrayList<Integer>()); for(int item: S) { List<List<Integer>> newResult = new ArrayList<>(result); for(List<Integer> list: result) { List<Integer> newList = new ArrayList<>(list); newList.add(item); newResult.add(newList); } result = newResult; } return result; }
Output:
[[], [1], [2], [1, 2], [3], [1, 3], [2, 3], [1, 2, 3]]
vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> res; res.push_back(vector<int>()); sort(nums.begin(), nums.end()); for(int num:nums) { int n = res.size(); for(int i=0; i<n; i++) { auto list = res[i]; list.push_back(num); res.push_back(list); } } return res; }
Solution 3:
Bitmap, binary representation
In S, , a 1 in the position corresponding to the location in the set indicates the presence of the element. So {x, y} = 110.
For the whole power set of S we get:
- { } = 000 (Binary) = 0 (Decimal)
- {x} = 100 = 4
- {y} = 010 = 2
- {z} = 001 = 1
- {x, y} = 110 = 6
- {x, z} = 101 = 5
- {y, z} = 011 = 3
- {x, y, z} = 111 = 7
public List<List<Integer>> subsets(int[] S) { List<List<Integer>> result = new ArrayList<>(); Arrays.sort(S); int n = S.length; int size = (int)Math.pow(2, n); for(int i=0; i<size; i++) { List<Integer> list = new ArrayList<>(); for(int j=0; j<n; j++) { if((i>>>j & 1) == 1) { list.add(S[j]); } } result.add(list); } return result; }
vector<vector<int>> subsets(vector<int>& nums) { int n = nums.size(); int size = pow(2, n); sort(nums.begin(), nums.end()); vector<vector<int>> res; for(int i=0; i<size; i++) { vector<int> v; for(int j=0; j<n; j++) { if(i&(1<<j)) v.push_back(nums[j]); } res.push_back(v); } return res; }
Time Complexity: O(n2^n)
Reference:
相关推荐
javascript js_leetcode题解之78-subsets.js
c语言入门 C语言_leetcode题解之78-subsets.c
javascript js_leetcode题解之90-subsets-II.js
python python_leetcode题解之090_Subsets_II
python python_leetcode题解之078_Subsets
c语言基础 c语言_leetcode题解之0090_subsets_ii.zip
c c语言_leetcode题解之0078_subsets.zip
subsets: 78 - permutation - combination sum: 39, 40, 216 - palindrome partitioning - regex - sudoku solver: 37 排序 - merge sort - quick sort - insertion sort - selection sort - counting sort 位操作 -...
3. LeetCode第78题:"Subsets"(子集):给定一个没有重复元素的整数数组,找出所有可能的子集(即功率集)。 4. LeetCode第316题:"Remove Duplicate Letters"(移除重复的字母):给定一个字符串,从中移除重复的...
- Subsets: 给定一组可能包含重复元素的整数数组,返回该数组所有可能的子集。 - Word Search: 给定一个m×n的二维字符网格board和一个单词(字符串)word,如果word存在于网格中,则返回true;否则,返回false。 - ...
- 在 Subsets 题目中,回溯算法用于找出集合的所有可能子集。 14. **递归与迭代**: - 递归是一种常见的编程技巧,它将问题分解为更小的问题,而迭代通常是递归的替代方案,使用循环结构代替递归结构。 - 在 ...
leetcode 1004 leetcode 题目分类 数组 哈希表 链表 堆 栈 队列 字符串 树 Trie BST 图 最小(大)堆 Two Points 滑动窗口 递归 回溯 动态规划 排序 拓扑排序 二分查找 数学 深度优先搜索 ...Subsets
leetcode安卓The_LeetCode_Awakens Notice Naming Rule 资料夹 请把题号(三码) 放在题目前面,并用"_" 隔开,题目中间有空格,请用“-” 隔开 (ex: 078_Subsets) 题号请参考 如果没有题号,就先省略 档案 Owner 整理...
leetcode写题闪退 #*的多少代表此题的有意思程度 有几题第一次写的时候思绪比较混乱: *****Regular Expression Matching 2014.10.29 对于Find Minimum in Rotated Sorted Array II 和 Find Minimum in Rotated ...
java java_leetcode题解之Partition to K Equal Sum Subsets.java
在LeetCode平台上的第78题,名为“Subsets”(子集),是一个经典的回溯算法问题,主要考察的是对数组操作和组合问题的理解。这道题目要求我们找到给定整数数组的所有可能子集。解这类问题时,Python作为一门简洁且...
997 leetcode c 保持饥饿,保持愚蠢 我自己的 leetcode 纯 c 解决方案。 去做: 使用哈希表更新 ...78-subsets.c。 (完毕) 使用动态规划更新 qn 494-target-sum.c。 (完毕) 使用位操作更新 289-game-
第78题“子集”是LeetCode中的一个经典递归与回溯问题,旨在考察开发者对这两种核心算法的理解和应用。 递归是一种解决问题的方法,它将一个问题分解为更小的子问题,直到子问题变得足够简单可以直接求解。递归通常...
第78题"子集"(Subsets)是LeetCode中的一个经典问题,它涉及到深度优先搜索(DFS)或回溯算法的应用。在此,我们将深入探讨这个问题的解决方案以及相关的C++编程知识。 ### 问题描述: 给定一个没有重复元素的整数...