博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LeetCode 90 Subsets II--In C++
阅读量:4090 次
发布时间:2019-05-25

本文共 1930 字,大约阅读时间需要 6 分钟。

思路:

由于这道题增加了冗余的属性,所以如果用Subset 1中的暴力递归进行求解的话,会浪费很多时间在扫描判断是否有重复值上。因此,类似于全排列的那个题,想到了在之前的基础上添加一个元素即可形成全新的子集的思路。

用一个vector<vector<vector<int>>> newadd变量来记录:每增加一个元素,就增加的子集

举例:

比如1,2,2这三个元素。

首先newadd中加入一个空集。当1加入之后,增加了{1}。第一个2加入后增加了{2}和{1,2}。第二个2加入后,增加了{2,2}和{1,2,3}。

规律就是,先对输入的vector<int>进行排序,得到一个上升的序列。当一个元素不等于和他相邻的前一个元素时,遍历之前所有的结果集,加上这个元素,作为增加这个元素就增加的子集。如果这个元素和他之前的那个元素重复,则遍历他之前的那个元素对应的结果集,加上这个元素,作为增加这个元素就增加的子集。

在上例中,1之前没有重复元素,遍历之前所有的结果集,只有一个空集,则新增{1}。第一个2需要遍历空集和{1},第2个2需要遍历{2}和{1,2}。

vector
> subsetsWithDup(vector
& nums) { vector
>> newadd; vector
> zero;//0个元素,相当于新增空集 newadd.push_back(zero); int m = nums.size(); if (m==0){ return zero; } vector
> result; //要排序 sort(nums.begin(), nums.end()); for (int i = 1; i <= m;i++){ if (i==1 || nums[i-1]!=nums[i-2]){ //如果是nums的第一个元素或这个元素与其前一个不相同 //需要全部遍历之前的newadd元素,并新增 vector
> mynewadd; for (int j = 0; j < i;j++){ int len = newadd[j].size();//第j个元素新增的子集数 if (len==0){ vector
everyelement; everyelement.push_back(nums[i-1]); mynewadd.push_back(everyelement); continue; } for (int k = 0; k < len;k++){//依次取出第j个元素的新增子集 vector
everyelement = newadd[j][k]; everyelement.push_back(nums[i-1]); mynewadd.push_back(everyelement); } } newadd.push_back(mynewadd); } else if(nums[i-1]==nums[i-2]){ //如果和前一个元素重复 //只在前一个元素新增集上新增 vector
> mynewadd; int len = newadd[i - 1].size(); for (int k = 0; k < len;k++){ vector
everyelement = newadd[i-1][k]; everyelement.push_back(nums[i-1]); mynewadd.push_back(everyelement); } newadd.push_back(mynewadd); } } //再循环拿出每个新增,整个进一个结果集中返回 for (int i = 0; i <= m;i++){ for (int j = 0; j < newadd[i].size();j++){ /*for (vector
::iterator it = newadd[i][j].begin(); it != newadd[i][j].end();it++){ cout << *it << " "; } cout << endl;*/ result.push_back(newadd[i][j]); } } vector
tempzero; result.push_back(tempzero); return result;}

转载地址:http://kbdii.baihongyu.com/

你可能感兴趣的文章
似乎写个ROS功能包并不难,你会订阅话题发布话题,加点逻辑处理,就可以写一些基础的ROS功能包了。
查看>>
if __name__ == ‘__main__‘:就是Python里的main函数,脚本从这里开始执行,如果没有main函数则从上到下顺序执行。
查看>>
PX4官方用户和开发手册的首页面是会给你选择英文和中文的
查看>>
网络协议栈我是不是可以这么理解,就是把你要发送的数据自动处理成TCPIP格式的消息发出去,这种底层的转换不需要你弄了。
查看>>
除了LwIP还有uIP
查看>>
《跟工程师学嵌入式开发》这本书最后的终极项目我反而觉得有说头
查看>>
博士的申请考核制
查看>>
MAVLink学习之路05_MAVLink应用编程接口分析(也有讲STM32下的收发函数)
查看>>
找到了中文版的mavlink手册
查看>>
浅谈飞控开发的仿真功能
查看>>
我觉得在室内弄无人机开发装个防撞机架还是很有必要的,TBUS就做得很好。
查看>>
serial也是见到很多次了,似乎它就是一种串行通信协议
查看>>
TBUS的一些信息
查看>>
PX4+激光雷达在gazebo中仿真实现(古月居)
查看>>
专业和业余的区别就在于你在基础在基本功打磨练习花的时间
查看>>
通过mavlink实现自主航线的过程笔记
查看>>
Ardupilot飞控Mavlink代码学习
查看>>
这些网站有一些嵌入式面试题合集
查看>>
我觉得刷题是有必要的,不然小心实际被问的时候懵逼,我觉得你需要刷个50份面试题。跟考研数学疯狂刷卷子一样!
查看>>
我觉得嵌入式面试三要素:基础吃透+项目+大量刷题,缺一不可。不刷题是不行的。而且得是大量刷,刷出感觉套路,别人做题都做得是固定题型套路条件反射了,你还在那慢慢理解慢慢推是不行的,也是考研的教训。
查看>>