LeetCode 90. Subsets II

solution1和2均是利用set的,3和4是不利用set的
Solution1:我的答案
迭代法

class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int> > result;vector<int> temp;result.push_back(temp);if (!nums.size()) return result;for (int i = 0; i < nums.size(); i++) {int temp_size = result.size();for (int j = 0; j < temp_size; j++) {vector<int> temp = result[j];temp.push_back(nums[i]);result.push_back(temp);}}set<vector<int> > res(result.begin(), result.end());return vector<vector<int> > (res.begin(), res.end());}
};

Solution2:我的答案
递归法

class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int> > result;vector<int> temp;my_subsets(nums, 0, result, temp);set<vector<int> > res(result.begin(), result.end());return vector<vector<int> > (res.begin(), res.end());}void my_subsets(vector<int>& nums, int step, vector<vector<int> >& result, vector<int>& temp) {if (step == nums.size()) {result.push_back(temp);return;}//不选择nums[step]my_subsets(nums, step + 1, result, temp);//选择nums[step]temp.push_back(nums[step]);my_subsets(nums, step + 1, result, temp);temp.pop_back();}
};

Solution3:
参考网址:http://www.cnblogs.com/grandyang/p/4310964.html
我们先来看非递归解法,拿题目中的例子[1 2 2]来分析,根据之前 Subsets 子集合 里的分析可知,当处理到第一个2时,此时的子集合为[], [1], [2], [1, 2],而这时再处理第二个2时,如果在[]和[1]后直接加2会产生重复,所以只能在上一个循环生成的后两个子集合后面加2,发现了这一点,题目就可以做了,我们用last来记录上一个处理的数字,然后判定当前的数字和上面的是否相同:
1)若不同,则循环还是从0到当前子集的个数;
2)若相同,则当前子集个数newSize减去之前循环时子集的个数size,即newSize - size当做起点来循环,这样需要遍历的元素就是当前子集的最后size个元素。
这样就不会产生重复了,代码如下:

class Solution {
public:vector<vector<int> > subsetsWithDup(vector<int> &S) {if (S.empty()) return {};vector<vector<int>> res(1);sort(S.begin(), S.end());int size = 1, last = S[0];for (int i = 0; i < S.size(); ++i) {if (last != S[i]) {last = S[i];size = res.size();}int newSize = res.size();for (int j = newSize - size; j < newSize; ++j) {res.push_back(res[j]);res.back().push_back(S[i]);}}return res;}
};

Solution4:
参考网址:http://www.cnblogs.com/grandyang/p/4310964.html
递归法
代码只需在原有的基础上增加一句话,while (S[i] == S[i + 1]) ++i; 这句话的作用是跳过树中为X的叶节点,因为它们是重复的子集,应被抛弃。代码如下:

class Solution {
public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {vector<int> path;vector<vector<int> > result;result.push_back(path);sort(nums.begin(), nums.end());helper(nums, 0, path, result);return result;}void helper (vector<int> &nums, int pos, vector<int>& path, vector<vector<int> > &result) {if (pos == nums.size())return ;for (int i = pos; i < nums.size(); i++) {path.push_back(nums[i]);result.push_back(path);helper(nums, i + 1, path, result);path.pop_back();while(i + 1 < nums.size() && nums[i] == nums[i+1]) i++;}}
};

【暴力枚举】LeetCode 90. Subsets II相关推荐

  1. LeetCode 90. Subsets II

    90. Subsets II Given a collection of integers that might contain duplicates, nums, return all possib ...

  2. 90 Subsets II

    90 Subsets II leetcode第90题,用深度优先搜索的思路写出了三种不同的代码.一道题目,同样是深度优先搜索的问题,因为看问题角度不同,思路不同,代码也不一样 /*** [1,2,2, ...

  3. 90. Subsets II 1

    题目: Given a collection of integers that might contain duplicates, nums, return all possible subsets. ...

  4. 90. Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...

  5. LeetCode 90.子集 II 中等难度

    90. 子集 II 题目: 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例:输入: [1,2,2] 输出: [[2],[1],[ ...

  6. LeetCode 90. 子集 II【数组,回溯算法,排序去重】

    90. 子集 II 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.返回的解集中,子集可以按 任意顺序 排列. 示例 1: 输入 ...

  7. [Leetcode]@python 90. Subsets II.py

    题目链接 https://leetcode.com/problems/subsets-ii/ 题目原文 Given a collection of integers that might contai ...

  8. leetcode 90. 子集 II 思考分析

    与本题相关联的题目解析: leetcode 78. 子集 思考分析 leetcode 40. 组合总和 II思考分析 题目 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集 ...

  9. LeetCode 90. 子集 II(回溯+剪枝)

    文章目录 1. 题目信息 2. 解题 2.1 循环 2.2 回溯 1. 题目信息 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例 ...

最新文章

  1. Linux(CentOS 7_x64位)系统下安装RDkit
  2. 如何从“查找”中排除所有“拒绝权限”消息?
  3. Mysql游标循环遍历_MySQL数据库中,使用游标循环遍历
  4. 2021牛客多校3 - Kuriyama Mirai and Exclusive Or(差分+倍增)
  5. 字符串系列之最长回文子串
  6. 操作 Wave 文件(13): waveOutGetVolume、waveOutSetVolume
  7. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(1)
  8. 数字盲打怎么练_数字键盘区的功能及指法技巧
  9. TypeError: can only concatenate str (not “list“) to str 报错
  10. Cocos2D-X2.2.3学习笔记9(处理重力感应事件,移植到Android加入两次返回退出游戏效果)...
  11. python逻辑运算优先级_测试误区《二》 python逻辑运算和关系运算优先级
  12. 基于Python操作Excel实战案例
  13. 2口百兆光纤收发器工业导轨式发送机
  14. 虚拟机无法启动(与设备不兼容)或者启动蓝屏
  15. mysql查询去除重复记录
  16. 全网首发C++ OBS源码分析与屏幕录制软件开发视频教程
  17. 2022最新显卡天梯图,2022显卡天梯排行榜
  18. 西湖,半含春雨半垂丝
  19. 区块链MMO游戏该如何设计Token经济?
  20. WPS下级标题不根据上级标题的编号改变而改变解决办法

热门文章

  1. HDU 1027 全排列
  2. C++如何防止头文件被二次编译
  3. 使用Typora绘制流程图
  4. java的if else if_java,if else和if else if else区别?
  5. (03)两个模型的交集、并集、差集
  6. 苹果电脑怎么看html5,苹果Mac系统看HTML5视频教程介绍
  7. bat 等待输入_深蓝词库转换 - 简单的输入法词库转换工具
  8. python应用程序实例_python中一个非常简单的异步应用程序
  9. OpenCV-Python实战(12)——一文详解AR增强现实
  10. Python-Matplotlib可视化(6)——自定义坐标轴让统计图清晰易懂