每日一题: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(2n1)=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还是比较适合用来学习算法和数据结构的,感觉写官方题解的人的水平也不一样,有的题解思路清晰,代码巧妙,能从代码中看出写这个代码的人造诣很高,对语言的理解也很深刻,但是今天的这个题解我就觉得不怎么样,子集那道题的题解我也觉得不怎么样,复杂度感觉都求错了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/383550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一题:leetcode1006.笨阶乘

题目描述 题目分析 因为顺序一定且没有括号&#xff0c;所以逻辑很简单。我们要顺序处理的矛盾在于&#xff0c;减号后面会再出现乘法和除法&#xff0c;我们不妨将对乘法和除法用一个临时值进行计算&#xff0c;计算结束后再合并到值里面&#xff0c;一般来讲乘法和除法的处理…

每日一题:leetcode80.删除有序数组中的重复元素贰

题目描述 题目分析 又是一道贴错标签的简单题&#xff0c;很明显的双指针&#xff0c;我的做法是用两个变量保存是否需要记录&#xff0c;官方题解的做法是直接判断&#xff0c;人家的高明一些 class Solution { public:int removeDuplicates(vector<int>& nums) {…

每日一题:leetcode81.搜索旋转排序数组Ⅱ

题目描述 题目分析 不含重复元素的题解&#xff08;leetcode33&#xff09; 这道题也是我们算法课的一道编程题&#xff0c;写完以后发现当时的思路和现在没有什么变化&#xff0c;果然是自己啊。我的想法是先判断区间整体是升序的还是旋转的&#xff0c;如果是升序的就按照正…

C++ JSON库:JSON for Morden C++

绪论 最近因为项目的需要&#xff0c;需要对JSON进行一定的数据处理&#xff0c;因为想要用C进行编码&#xff0c;便对C的JSON库进行的调研&#xff0c;发现这个库比较好用&#xff1a;JSON for Morder C。 使用指南 想要使用这个json库&#xff0c;只需要在源文件中包含jso…

Linux信号实现精确到微秒的sleep函数:通过sigsuspend函数解决时序竞态问题

原理就是先使用定时器定时&#xff0c;然后再使用pause函数或者sigsuspend函数主动阻塞挂起&#xff0c;最终恢复现场。 如果使用pause函数的话&#xff0c;优点是使用简单&#xff0c;缺点是有可能产生时序竞态&#xff0c;导致进程一直阻塞下去&#xff1a;在定时和挂起之间…

Linux创建多个子进程并通过捕获SIGCHLD信号进行非阻塞回收

我们通过fork函数创建多个子进程&#xff0c;并通过exec函数族在子进程中进行其他的工作&#xff0c;但是为了避免僵尸进程&#xff0c;我们要对子进程进行回收。常用的回收方式是wait或者waitpid进行阻塞回收&#xff0c;因为如果非阻塞回收很难把握时机&#xff0c;而阻塞回收…

Linux创建守护进程

守护进程&#xff08;Daemon&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过…

Linux创建多个子线程并回收

创建子线程的逻辑相比子进程要更容易理解一些&#xff0c;因为线程没有像进程那样复制很多东西另起炉灶&#xff0c;子线程从传入的开始函数开始运行&#xff0c;但是难点在于传入参数和回收时获取退出状态&#xff0c;因为这两个原本都是void *类型的&#xff0c;而我们在使用…

Qt发布程序

Windows&#xff1a; https://www.cnblogs.com/linuxAndMcu/p/10974927.html Ubuntu&#xff1a; https://blog.csdn.net/u014779536/article/details/107854060

K210入门

之前购买了一个Sipeed Maix M1w Dock k210的开发板&#xff0c;想着自己鼓捣鼓捣&#xff0c;在网上看到了一些好的教程&#xff0c;在这里记录一下&#xff1a; 嵌入式AI从入门到放肆【K210篇】-- 硬件与环境&#xff1a;介绍了各种开发环境的搭建&#xff0c;但是不是特别详细…

C++输入输出:cin/cout 还是 scanf/printf?

相信使用C的人都有一种迷惑或者是不自信&#xff1a;在输入输出的时候是不是应该使用scanf/printf更好呢&#xff0c;因为传说cin/cout龟速&#xff0c;我当时也长期被这个所困扰&#xff0c;后来在阅读C primer第五版的时候我自己做了一个测试&#xff0c;发现如果不使用std::…

UVA - 101:The Blocks Problem

原本以为是一道很简单的模拟题&#xff0c;结果写了一个小时。。。很长时间不碰算法题&#xff0c;的确手感差很多。不过我觉得随着刷题慢慢多起来应该会好的。 题目的意思也有点含糊&#xff0c;需要自己去猜&#xff0c;大概意思就是槽里有一堆木头&#xff0c;每个槽刚开始…

UVA - 12096:The SetStack Computer

题目描述很简单&#xff0c;难点在于如何对集合进行编码&#xff0c;因为是无限的&#xff0c;好像没有一个方向进行编码。 紫书给的题解十分巧妙&#xff1a;给新出现的集合进行编码 的确&#xff0c;我们没有必要为所有可能出现的集合编码后再开始&#xff0c;我们就可以简单…

UVA - 540:Team Queue

主要的关键在于&#xff1a;不要试图让所有团队的人在一个队列里面&#xff0c;因为这样如果新入队的是一个前面团队的成员则必须先出队再入队。 应该把每个团队看做一个整体&#xff0c;用一个队列维护团队的顺序&#xff0c;用t个队列维护每个团队内部的顺序。 还有就是要维…

UVA-136:Ugly Numbers

很简单的一道题&#xff0c;但是我竟然蠢到想不明白为什么如果从头生成会出现大量重复的数字。 写的时候主要出现的错误在爆int上&#xff0c;一定要注意数据范围。 #include <iostream> #include <queue> #include <set>using namespace std; using ll lo…

类的成员函数可以访问属于该类的任意对象的私有变量

之前在书上看到成员函数可以访问类的私有变量的时候觉得是废话嘛&#xff0c;如果成员函数都不能访问那私有变量不就变成了花瓶了。然而发现自己还是太naive。 这句话的意思是&#xff1a;在类的作用域内&#xff0c;包含成员函数、静态成员函数和友元函数内&#xff0c;可以访…

GMP使用入门

最近写了一个高精度的模板&#xff0c;想要用GMP库测试一下&#xff0c;总结一下GMP环境的搭建。 环境搭建&#xff1a;GMP大法教你重新做人(从入门到实战) 解压.tar.lz的 时候可能会遇到一点问题&#xff0c;可以参考这个博客&#xff1a;.tar.lz压缩包解压 需要注意的是C需要…

UVA - 400:Unix ls

题目的难点在于要求前面的每一列的是最大长度L2&#xff0c;最后一列的长度是L。对于宽度为WIDTH60的一行来说&#xff0c;一行可以放下多少个单词决定了需要多少行&#xff0c;知道了行数才能开始根据行数开始放置。 我的做法是col (WIDTH 2) / (L 2)&#xff0c;即提前给W…

UVA - 1592:Database

题目的意思是找到两行在两列处相等&#xff0c;主要要做的是记录某个值是否重复出现过。 经过思考&#xff0c;我的思路是&#xff1a;每一列用一个unordered_map<string,vector<int>>记录单词出现的行数&#xff0c;对于某一行中的两列&#xff0c;如果有两个元素…

C++ array初始化需要双层大括号

对于array的初始化我们可以使用列表初始化&#xff1a; array<int, 8> test {1,2,3,4,5,6,7,8 };但是当我们不再使用简单的内置类型array时&#xff1a; array<pair<int, int>, 8> dirs {{-1, -1},{-1, 0},{-1, 1},{0, -1},{0, 1},{1, -1},{1, 0},{1, 1}…