增量构造法--解决子集问题的利器
来源:互联网 发布:淘宝权女友静雯 编辑:程序博客网 时间:2024/05/31 19:45
原题见leetcode的subSets和subsetsWithDup,本篇文章着重采用“增量构造法”,解决此类问题。当然,还有其他办法,如递归法、位向量法等。
首先看subSets题目:https://oj.leetcode.com/problems/subsets/,描述如下:
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], []]采取增量构造法,意味着首先声明一个vector<vector<int> > 的变量res,首先res需要插入一个空的元素,然后每次读取res的元素个数,插入与其元素个数相同的元素。
如第一次,res.size() = 1,那么只插入一个元素;第二次,res.size() = 2,插入2个,故每次分别插入1、2、4、8...个元素。代码如下:
void subSetNoDup(vector<int> s, vector<vector<int> > &res)
{
if(s.empty())
return;
sort(s.begin(), s.end());
res.clear();
res.resize(1);
for(int i = 0; i < s.size(); i++)
{
int size = res.size();
for(int j = 0; j < size; j++)
{
res.push_back(res[j]); /* 在res的末尾插入相同元素 */
res.back().push_back(s[i]); /* 在新插入的元素里,加入新的子元素 */
}
}
}
然后有此题目的变种:subsetsWithDup:https://oj.leetcode.com/problems/subsets-ii/,描述如下:
Given a collection of integers that might contain duplicates, 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,2]
, a solution is:
[ [2], [1], [1,2,2], [2,2], [1,2], []]此时,数组中存在重复元素,需要“去重”。思路是:设prev是前一个元素,nxt是prev的下一个元素,且两者相等;那么在已经插入prev的前提下,nxt只有一种选择:一、和prev在一起,构造新的元素。意思就是,在之前的元素里,如不存在prev,那么nxt必须跳过这些元素。因此,需要记录上次res的元素个数,代码如下:
void subSetwithDup(vector<int> s, vector<vector<int> > &res)
{
if(s.empty())
return;
sort(s.begin(), s.end());
int previse_size = 0;
res.clear();
res.resize(1);
for(int i = 0; i < s.size(); i++)
{
int size = res.size();
for(int j = 0; j < size; j++)
{
if(i == 0 || s[i] != s[i-1] || j >= previse_size) /* 3中情况下,可插入当前元素,最后一种是上述情况 */
{
res.push_back(res[j]);
res.back().push_back(s[i]);
}
}
previse_size = size; /* 记录上一次res的元素个数 */
}
}
- 增量构造法--解决子集问题的利器
- 子集生成 增量构造法
- 增量构造法输出所有子集
- 子集生成的两种方法 (增量构造法 和 位向量法)
- 枚举子集 增量构造法 位向量法 二进制法
- 子集生成:增量构造法 位向量法 二进制法
- 子集生成 增量构造法 位向量法 二进制法
- 子集生成算法——增量构造法
- 子集生成之增量构造法(允许有重复元素)
- ACMjava子集生成的三种方法,增量构造,辅助位向量,二进制法
- 子集生成算法 之 位向量法和增量构造法
- 暴力求解法_子集生成(增量构造法,位向量法,二进制法)
- 【算法竞赛入门经典】7.3子集生成【增量构造法】【位向量法】【二进制法】
- UVA - 11205 The broken pedometer(子集枚举+增量构造法)
- 子集合的构造
- 回溯法解决子集和问题
- 回溯法解决子集和问题
- 子集构造 集合的子集合
- VS2010/MFC编程入门之三(VS2010应用程序工程中文件的组成结构)
- 仿淘宝 纵向滚动式 定位 导航栏
- CentOS上编译安装OpenCV-2.3.1与ffmpeg-2.1.2
- Uiwebvie笔记 之初始化
- 积累(四)
- 增量构造法--解决子集问题的利器
- OpenCV基础篇之读取显示图片
- OpenCV基础篇之像素操作对比度调节
- python命名中下划线的含义
- HDU——5053 the Sum of Cube
- DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash
- 关于Java 23种设计模式的有趣见解
- GCD题目汇总
- 分布式发布订阅消息系统 Kafka 架构设计