1.两数之和
这一题本来我是想排个序,然后用两指针方法,但是写完发现这样的话没法记录排序前的序号。看完题解发现是用hash表(unordered_map)。构造hash表的过程是o(n),进行查找是o(1)。
迭代器iter->first和iter->second分别表示键和值。
2.字母异位词分组
这一题的关键词依旧是哈希表。我第一瞬间的想法是构造哈希表,然后对每个词,比如eat,分别用他的异位词进行查找。但是这样有一个问题,一个是异位词怎么全部表示出来,还有一个是可能同一个异位词有多个,但是查找只能找到其中一个(这个可以通过多次查找解决,每次找到一个就用erase删除这个元素)。看了题解发现,我们可以对key-value中的key做手脚,不用词本身作为key,而是用异位词的共性作为key,比如排序后的词,或者计数后的词。
3.最长连续序列
我其实只想到了题解的前半部分。先用unordered_set存储key(也就是序列里的每个值),也可以用unordered_map,但是value就没用上。然后就是遍历这个哈希表,对每个值,找基于它的最长序列。我一开始的想法是往左找+往右找,然后加起来,但是这样其实并不是o(n)的。题解的想法是对于遍历的每个值,先看这个值是不是序列的开头,怎么判断?——用哈希查找该值-1,如果不存在说明这个值必定是序列开头,这是一个小trick。
4.移动零
我的想法是如果一个数前面有一个零,则它最终会出现在往前一个位置;如果一个数前面有n个零,则它最终会出现在往前n个位置。所以就遍历,然后统计0的个数,把非0数往前提。最后在尾部添加上若干0。但是这个思路其实并没有用到双指针。双指针可以这样用:当右指针处的值不为0时,与左指针处互换,然后左右都加1;否则不换,只有右加1。
5.盛最多水的容器
这一题之前做过,略。