2019-06-17说好要写一百篇CSDN的今天就开始吧虽然过两天又要断更了但是我还是含泪写下这一篇甘愿做一个小分子我也不知道为什么自己这么菜啊但是从现在开始好好努力才能厚积薄发啊我们并没有放弃我在等

今天总结一下关于近期做那个三数之和四数之和的问题,debug了很久很久,我觉得我对这类问题都能很熟练的完成了吧,都快背过来了,100数之和写个98层for循环?诸如此类……

首先方法就是双指针,然后没了。

这道题考察的细节有很多,比如如何排除过多的重复序列,学到了两个方法,一个是set这个关联容器的使用,一个是优先判断前一个或者两个元素是否和上一个相同(三个数的就判断第一个数,四个数的判断前两个数……)碰见相同的,后面几个指针再怎么乱指(locking??)也不过是找到了即将要被删除的序列罢了……这种情况下果断continue……i++就完事了,后面sum和target的值不用再判断了,节省了大把时间啊……学到了。

还有就是关联容器set,先把查好的序列压入set<vector<int>>中,自动就会略去相同的元素了,再在for循环中使用auto语句进行遍历,压入最后盛放结果的vector中就好了……

搬运一下关于set关联容器的知识!

关联容器与序列容器有着根本性的不同,序列容器的元素是按照在容器中的位置来顺序保存和访问的,而关联容器的元素是按关键元素来保存和访问的。关联容器支持高效的关键字查找与访问。两个主要的关联容器类型是map与set。

特点如下:

  • 储存同一类型的数据元素(这点和vector、queue等其他容器相同)
  • 每个元素的值都唯一(没有重复的元素
  • 根据元素的值自动排列大小(有序性
  • 无法直接修改元素

除了常规的insert,set还支持一下方式进行插入:

set<int> a = {0,1,2,9};
set<int> b = {3,4,5};
auto first = b.begin();
auto second = b.end();
a.insert(first,second);
for(auto it = a.begin();it != a.end();it++)	cout << *it;

a.insert(first,second):其中first为指向区间左侧的迭代器,second为指向右侧的迭代器。作用是将first到second区间内元素插入到a(左闭右开)。插入的元素会自己找到合适位置以保持整个set的有序性。

同样erase也可以使用上述方法。

更加具体的介绍详见这个:https://blog.csdn.net/weixin_41162823/article/details/80185444

刷了一个leetcode,删除倒数第k个节点的……

我真的好讨厌链表啊,不动笔划几下,根本绕不过来逻辑……

问题出在那个删除头结点这个问题上……借鉴的是CSDN大神的那个双指针移动法,即存在一个fast一个slow,fast先走K步,slow再出发,当fast到达末端时,slow就处在那个倒数第k个节点上了!当fast==NULL 时,说明要删除的是头结点,按照题目要求,return head->next就好了……

今儿没带耳机就不刷TED了……                                                                                                                                                                                                                                                                                                                                                          

 

 
发布了42 篇原创文章 · 获赞 16 · 访问量 2899

猜你喜欢

转载自blog.csdn.net/weixin_44412218/article/details/92628567