LeetCode 面试题 08.04. 幂集

文章目录

一、题目

幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。

说明:

  • 解集不能包含重复的子集。

示例:

输入: nums = [1,2,3]
输出:

[

[3],

[1],

[2],

[1,2,3],

[1,3],

[2,3],

[1,2],

[]

]

点击此处跳转题目

二、C# 题解

记集合为 Q(n),n 为集合中元素个数(不重复)。Sub(i) 表示集合中 i 个元素组成的所有子集,则有如下递推关系:

S u b ( i + 1 ) = S u b ( i ) ∪ S u b ( i ) . A d d ( e l e m ( i + 1 ) ) Sub(i +1)=Sub(i) \cup Sub(i).Add(elem(i+1)) Sub(i+1)=Sub(i)∪Sub(i).Add(elem(i+1))

其中, e l e m ( i + 1 ) elem(i+1) elem(i+1) 表示新增加的第 i + 1 i + 1 i+1 个元素。以集合 { 1 , 2 , 3 } \{1,2,3\} {1,2,3} 为例:

  • S u b ( { 0 } ) = { { } } Sub(\{0\})=\{\{\}\} Sub({0})={{}}
  • S u b ( { 0 , 1 } ) = { { } } ∪ { { 1 } } = { { } , { 1 } } Sub(\{0,1\})=\{\{\}\}\cup\{\{\bold{1}\}\}=\{\{\},\{1\}\} Sub({0,1})={{}}∪{{1}}={{},{1}}
  • S u b ( { 0 , 1 , 2 } ) = { { } , { 1 } } ∪ { { 2 } , { 1 , 2 } } = { { } , { 1 } , { 2 } , { 1 , 2 } } Sub(\{0,1,2\})=\{\{\},\{1\}\}\cup\{\{\bold{2}\},\{1,\bold{2}\}\}=\{\{\},\{1\},\{2\},\{1,2\}\} Sub({0,1,2})={{},{1}}∪{{2},{1,2}}={{},{1},{2},{1,2}}
  • S u b ( { 0 , 1 , 2 , 3 } ) = { { } , { 1 } , { 2 } , { 1 , 2 } } ∪ { { 3 } , { 1 , 3 } , { 2 , 3 } , { 1 , 2 , 3 } } = { { } , { 1 } , { 2 } , { 3 } , { 1 , 2 } , { 1 , 3 } , { 2 , 3 } , { 1 , 2 , 3 } } Sub(\{0,1,2,3\})=\{\{\},\{1\},\{2\},\{1,2\}\}\cup\{\{\bold{3}\},\{1,\bold{3}\},\{2,\bold{3}\},\{1,2,\bold{3}\}\}=\{\{\},\{1\},\{2\},\{3\},\{1,2\},\{1,3\},\{2,3\},\{1,2,3\}\} Sub({0,1,2,3})={{},{1},{2},{1,2}}∪{{3},{1,3},{2,3},{1,2,3}}={{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}}
csharp 复制代码
public class Solution {
    public IList<IList<int>> Subsets(int[] nums) {
        IList<IList<int>> ans = new List<IList<int>>();
        ans.Add(new List<int>()); // 添加空集
        
        if (nums.Length == 0) return ans;
        
        foreach (int t in nums) {
            int cnt = ans.Count; // 取出原来的长度
            for (int j = 0; j < cnt; j++) {
                // 复制原来所有的子集,将新元素添加进去
                List<int> tmp = new List<int>(ans[j]) { t }; 
                ans.Add(tmp);
            }
        }

        return ans;
    }
}
  • 时间:128 ms,击败 100.00% 使用 C# 的用户
  • 内存:40.76 MB,击败 100.00% 使用 C# 的用户
相关推荐
passer__jw7671 小时前
【LeetCode】【算法】3. 无重复字符的最长子串
算法·leetcode
passer__jw7671 小时前
【LeetCode】【算法】21. 合并两个有序链表
算法·leetcode·链表
sweetheart7-71 小时前
LeetCode22. 括号生成(2024冬季每日一题 2)
算法·深度优先·力扣·dfs·左右括号匹配
__AtYou__2 小时前
Golang | Leetcode Golang题解之第557题反转字符串中的单词III
leetcode·golang·题解
2401_858286113 小时前
L7.【LeetCode笔记】相交链表
笔记·leetcode·链表
IT规划师3 小时前
开源 - Ideal库 - 常用枚举扩展方法(一)
开源·c#·.net core·ideal库·枚举转换
景鹤4 小时前
【算法】递归+回溯+剪枝:78.子集
算法·机器学习·剪枝
_OLi_4 小时前
力扣 LeetCode 704. 二分查找(Day1:数组)
算法·leetcode·职场和发展
丶Darling.4 小时前
Day40 | 动态规划 :完全背包应用 组合总和IV(类比爬楼梯)
c++·算法·动态规划·记忆化搜索·回溯
风影小子4 小时前
IO作业5
算法