每日一题:leetcode90.子集贰
题目描述
题目分析
感觉这道题让自己对枚举排列有了一个更好的认识,感觉自己的这种思路不错。
假设没有重复元素(退化成78.子集),我们应该怎么做?初始的时候幂集中只有一个空集,然后对每个元素,我们添加给幂集中的每个元素,这样进行一遍遍历,复杂度是O(1)+O(2)+O(4)+...+O(2n−1)=O(2n)O(1)+O(2)+O(4)+...+O(2^{n-1})=O(2^n)O(1)+O(2)+O(4)+...+O(2n−1)=O(2n)
对于有重复元素的我们应该如何处理呢?不难发现,假设我们把重复元素放在一起,则对于第一个元素是没有什么影响的,但是对第二个元素开始,我们对幂集最前面集合添加元素和前面的那个元素没有区别,因此就会出现重复,从哪里开始不一样呢?从前一个元素开始添加的部分开始,因此我们用一个变量记录前一个元素开始添加的位置,然后从重复元素的第二个开始都从前一个元素添加的开始位置开始添加,最后更新这个变量。可以再对照代码理解一下,代码比较简单
class Solution {public:vector<vector<int>> subsetsWithDup(vector<int>& nums) {sort(nums.begin(), nums.end());vector<vector<int>> ans;ans.push_back(vector<int>());ans.push_back(vector<int>());ans.back().push_back(nums[0]);int n = nums.size();int pre_i = 1; //保存上次添加后的起始地址for(int i = 1; i < n; ++i) {int m = ans.size();int j = 0;if (nums[i] == nums[i - 1]) {//如果和上一个数字一样,则从上一个数字开始的地方开始,因为前面的已经由上一个数字处理过了j = pre_i;}for (; j < m; ++j) {auto t = ans[j];t.push_back(nums[i]);ans.push_back(t);}pre_i = m; //更新per_i}return ans;}
};
吐槽
觉得子集的思路比题解的要清晰,复杂度应该也低很多,我这个应该是O(2n)O(2^n)O(2n),不知道为什么题解的那么复杂,要枚举二进制或者用回溯。
这个执行用时有点玄学的,可能只测试了部分样例吧,毕竟是企业,少测试一会就可以多赚钱,可以理解。我觉得leetcode还是比较适合用来学习算法和数据结构的,感觉写官方题解的人的水平也不一样,有的题解思路清晰,代码巧妙,能从代码中看出写这个代码的人造诣很高,对语言的理解也很深刻,但是今天的这个题解我就觉得不怎么样,子集那道题的题解我也觉得不怎么样,复杂度感觉都求错了。
每日一题:leetcode90.子集贰相关推荐
- 易错丨Oracle 每日一题系列合集
在墨天轮平台有个[数据库每日一题]栏目:www.modb.pro/test(复制到浏览器或者点击"阅读原文"可直达,每日一题),均是由数据库行业的专家亲自出题,墨天轮审核后发布的一 ...
- leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树
leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...
- LeetCode每日一题系列 随缘更新
##每日一题## 根据前序遍历和中序遍历构造二叉树 思路:从性质出发,前序数组的开头就是根节点,然后对应到中序数组,得到左子树和右子树,分别再构造左子树和右子树 下标对应: [外链图片转存失败,源站可 ...
- Leetcode每日一题总目录(动态更新。。。)
0. 概要 leecode每日一题(也可能多题)题解跟踪记录及总目录. 常用算法解题思路和技巧及数据结构: 预处理:数组排序(954),哈希表... 双指针法 682,125,905 单向链表 2 双 ...
- 2020PMP(第六版)每日三题
PMP12月份考试已经顺利通过,这里将平时积累的每日三题发出来供大家分享:(结尾分享一点考试心得体会) 一.题目部分: 2020.9.27 三题: 1.项目是: A. 一组持续的活动中执行的一个过程或 ...
- [每日一题] 0. 每日一题题解汇总
每日一题 锻炼编程能力,每日尽量至少更新一道算法编程题,其各题目代码已经同步到我的GitHub的Everyday_Coding仓库中:Y-puyu的GitHub仓库,博客内主要更新学习C/C++.Li ...
- Oracle 每日一题系列合集
作者 | JiekeXu 来源 | JiekeXu之路(ID: JiekeXu_IT) 转载请联系授权 | (微信ID:xxq1426321293) 大家好,我是 JiekeXu,很高兴又和大家见面了 ...
- 对数函数定义域和值域_呆哥数学每日一题 —— 复合函数值域
如果想要获取往期每日一题电子版,可以加我微信:daigemath366,备注:知乎 每日一题 呆哥解析:这是一个函数和复合函数的综合问题 首先我们先把原函数的值域求出来 先直接求导: 导数不容易判断单 ...
- 每日一题(进制转换)
前言:为了让小伙伴更方便的学习编程语言,小白每天都会分享一道编程题.小白也创建了一个微信公众号,会同步更新题目和相关的视觉领域的知识,如果小伙伴不方便在网页上阅读文章,可以关注微信公众号"小 ...
最新文章
- Linux 下 LaTeX 2018 安装与使用
- 利用vim查看日志,快速定位问题《转载》
- Java单向链表操作详解
- [转贴]无刷新的2个DropDownList联动
- MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
- 属实逼真,决策树可视化!
- .NET单点登录实现方法----两种
- 24-[模块]-re
- Python3.6连接mysql(一)
- 在Activiti中如何使用自定义的组织架构
- 视频换脸新境界:CMU不仅给人类变脸,还能给花草、天气变脸 | ECCV 2018
- Java NIO 详解(一)
- plsql 破解|oracle plsql 破解
- 牛客练习赛41 E-球的体积并——————几何
- 卸载python2.7_98%的人这样卸载软件,真的卸载干净了吗?这才是正确的卸载方式...
- 计算机组成原理4位快速加法器
- win10系统点击控制台自定义快捷键失效问题解决
- リヴァイア / 鱼妹
- 根据Email地址跳转到邮箱登录界面
- 西安电子科技大学计算机研究生工资,双一流高校本硕博毕业生,薪酬排名!西安电子科技大学全国第5!...
热门文章
- CentOS6.5安装MySQL5.7详细教程
- 读书笔记-你不知道的JS上-混入与原型
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
- $Android自定义控件在不同状态下的属性
- SharePoint 2010 Form Authentication (SQL) based on existing database
- poj 2528_2
- 爱课程c语言函数2的作业答案,C语言程序设计
- jmeter找不到java.dll_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
- android paint 圆角 绘制_[BOT] 一种android中实现“圆角矩形”的方法
- unity中单位是米还是厘米_401场地清理是什么,由施工单位做还是甲方做?造价中如何体现?...