今天总结一下关于近期做那个三数之和四数之和的问题,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了……