Given a set of distinct integers, nums, return all possible subsets.

Note: 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],
[]
]

就是求指定集合的所有子集.

三种解法:

  • Recursive (Backtracking) 道理能理解,代码不容易写;
  • Iterative 本文用的解法,好直接,易理解和实现
  • Bit Manipulation 还没学,再补充.

方法1, Recursive (Backtracking)

代码中的注释是我的理解.

// Recursive (Backtracking)
vector<vector<int>> subsets(vector<int>& A) {
sort(A.begin(), A.end()); // sort
vector < vector<int> > res;
vector<int> sub; // 四个参数
// A, 二维res, 临时sub, 待处理数组A元素索引号indx
genSubset(A, res, sub, 0);
return res;
} // DFS:
// box 套 box, 好奇的小儿一直往里面开 box
void genSubset(vector<int>& A, vector<vector<int> >& res, vector<int> sub,
int start) {
res.push_back(sub);
for (int i = start; i < A.size(); i++) {
// 假设 sub = [1]
// sub里压入一个2, sub = [1, 2]
sub.push_back(A[i]); // 看看压入2后, 还有谁?!!
genSubset(A, res, sub, i + 1); // 还有谁的事,由genSubset探查完后,
// 把2弹出去, sub = [1], 然后下轮循环, 看看谁还能和 1 搭个伴,
// 假设A中还有3, 那么下次循环 sub = [1, 3]
// 直到 1 和所有A中剩余元素都结合过
sub.pop_back();
}
}

方法2, Iterative

想法:

就是编程实现下面的东西:

[[]]
[[], []] --> [[], [1]]
[[],[1]] -复制-> [[],[1],[],[1]] -添值-> [[],[1],[2],[1, 2]]
[[],[1],[2],[1, 2]] -复制-> [[],[1],[2],[1, 2],[],[1],[2],[1, 2]] -添值-> [[],[1],[2],[1, 2],[3],[1,3],[2,3],[1, 2, 3]]

上面的例子不太准确(细节写准确太长了,下面针对一个小东西仔细描述过程),但思路是对的.

下面才是程序真正的执行结果:

应该是这样的,我们拿出一小段做解释^^
[[],[1]] -复制-> [[],[1],[]] -添值-> [[],[1],[2]] -复制-> [[],[1],[2],[1]] -添值-> [[],[1],[2],[1,2]]

人家想法,自己代码:

\(O(n^2)\) time, \(O(1)\) extra space.

vector<vector<int>> subsets(vector<int>& A) {
sort(A.begin(), A.end()); // sort
vector < vector<int> > res(1, vector<int>()); // declare res = [[],];
const int n = A.size(); for (int i = 0; i < n; i++) {
const int m = res.size();
for (int j = 0; j < m; j++) {
// 有坑, 注意, 不可妄图写成下面这样:
// res.push_back(res[j].push_back(A[i]));
res.push_back(res[j]); // [[], []]
res.back().push_back(A[i]); // [[], [1]]
}
}
return res;
}

顺便上面代码展示了一些关于c++写代码的副产品,如下:

  1. 声明一个 [[],] 的二维数组: vector < vector<int> > res(1, vector<int>());
  2. 这么写结果不对: for(auto it : res) res.push_back(it.push_back(A[i])); 我晕!
  3. 不能妄图写成这样: res.push_back(res[j].push_back(A[i])); 有点边迭代,边修改数组的意思.
  4. push_back() 和 back() 的区别:
    • coll.push_back()是把一个元素,放入这个容器的末尾,相当于末尾添加一个元素;
    • coll.back()是获取最后一个元素的迭代器,你可以理解为最后一个元素的指针.

接下来是第3种方法,Bit Manipulation 但还没学,再补充.

TODO Bit Manipulation

78. Subsets(中等,集合的子集,经典问题 DFS)的更多相关文章

  1. [LeetCode] 78. Subsets 子集合

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  2. [LeetCode] Subsets 子集合

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  3. LeetCode OJ 78. Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...

  4. 刷题78. Subsets

    一.题目说明 题目78. Subsets,给一列整数,求所有可能的子集.题目难度是Medium! 二.我的解答 这个题目,前面做过一个类似的,相当于求闭包: 刷题22. Generate Parent ...

  5. python 实现求一个集合的子集

    概要 今天偶然看到有个关于数学中集合的问题,就突发奇想的想用python实现下求一个集合的子集. 准备 我当然先要复习下,什么是集合,什么是子集? 比较粗犷的讲法,集合就是一堆确定的东西,细致一点的讲 ...

  6. 78. Subsets(M) & 90. Subsets II(M) & 131. Palindrome Partitioning

    78. Subsets Given a set of distinct integers, nums, return all possible subsets. Note: The solution ...

  7. leetcode 78. Subsets 、90. Subsets II

    第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值. level代表的是需要进行选择的数值的位置. 78. Subsets 错误解法: cl ...

  8. [python语法]python中如何判断一个集合是另一个集合的子集?

    问:python中如何判断一个集合是另一个集合的子集? 答:用issubset()方法 语法: A.issubset(B) 返回: True 如果A是B的子集. False 如果A不是B的子集. 样例 ...

  9. 59-python基础-python3-集合-集合常用方法-判断一个集合是否是另一个集合的子集-issubset()-issuperset()

    判断一个集合是否是另一个集合的子集-issubset()-issuperset() 1-issubset() s1.issubset(s) 判断s1是否是s的子集 2-issuperset() 与is ...

随机推荐

  1. Docker学习笔记 - Docker容器内部署redis

    Docker学习笔记(2-4)Docker应用实验-redist server 和client的安装使用 一.获取redis容器(含客户端和服务端) 二.创建服务端容器 1.在终端A中运行redis- ...

  2. 记录下项目中常用到的JavaScript/JQuery代码一(大量实例)

    一直没有系统学习Javascript和Jquery,每次都是用到的时候去搜索引擎查,感觉效率挺低的.这边把我项目中用的的记录下,想到哪写哪,有时间再仔细整理. 当然,由于我主要是写后端java开发,而 ...

  3. Xshell与虚拟机不能正常连接

    1.发现Xshell与虚拟机下的两个CentOS都不能正常连接,在这些系统下采用ifconfig查询发现eth0都没有ip地址,进而想到可能是虚拟机的设置出了问题,后来又想到自己之前曾经尝试过设置VM ...

  4. geotrellis使用(三十七)COG 基础介绍

    前言 Geotrellis 已经迭代到了 2.0 版本(截止写作此文时为 2.0.0-SNAPSHOT 版),2.0 版多了很多新的特性,其中最重要的应该就是 COG,COG 是什么鬼?刚看到时我也是 ...

  5. JS-DOM ~ 03. 子节点的操作、style.样式和属性、dom元素的创建方法及操作、14个例题、主要是利用js直接控制html属性

    带有Element和不带的区别 a)  带Element的获取的是元素节点 b)  不带可能获取文本节点和属性节点 获取所以子节点 a)   . childNodes b)   . children ...

  6. scala求交集、并集、差集命令

    交集 scala> Set(1,2,3) & Set(2,4)res1: scala.collection.immutable.Set[Int] = Set(2) 并集 scala> ...

  7. app 下载更新 file-downloader 文件下载库的简单介绍和使用

    app 下载更新 file-downloader 文件下载库的简单介绍和使用 今天介绍一个下载库:file-downloader 文件下载库 说明: * 本文内容来自原 file-downloader ...

  8. JS随机数不重复

    方法一 思路:首先创建一个1到3000的数组,每次取一个数,然后去除数组中取出的这个数, 这样就可以实现永不重复. var count=3000; var originalArray=new Arra ...

  9. 使用 dotnet cli 命令上传 nuget 程序包

    前言 前面写了一篇文章介绍了如何将自己的程序集打包成nuget package并上传到nuget.org,传送门.全部是通过网页端来进行操作的,现在介绍一种比较方便快捷的方法就是用dotnet cli ...

  10. 实验吧_登陆一下好吗(骚注入)&你真的会PHP吗?(代码审计)

    登陆一下好吗 首先看到两个输入框,分别对应账号密码,随手输个admin,admin进去,提交后发现有回显,既然题目说了过滤了一切,那就先看看过滤了些啥 经过一波测试,发现服务器过滤了union,sel ...