454:
第一次做。刚开始的思路是把四个数组都放进各自的哈希表里然后进行操作,但这样的话和暴力解法的区别不大,都要四个for循环套在一起遍历。
看了题解的前两步稍微有点眉目了:把ab数组的和放进哈希表里,key是和,value是出现的次数。然后再遍历cd数组,用0减去cd的和,并在哈希表里查找是否存在符合的数值。
但有个很关键的点就是计算有效结果数时是允许数值相同的元素的,也就是说哈希表中每一个符合条件的key出现的每一次(也就是value)都是有效的,在统计结果时要将所有key的value相加而不是每找到一个key就+1。
383:
一开始的思路是把ransom用哈希表记录,然后减去magazine里的字母出现的次数。写完之后发现用数组会更简洁,只不过需要反过来记录。
关键点是要搞明白return true和false的分界点在哪里。一开始我写的是只要数组里有不等于0的数就return false,但这样忽略了magazine里特定字母数大于所需要的数量(这种情况下由于有冗余,特定字母的计数会是大于0的),正确的false条件是某所需字母的位置的数字小于0。
15:
难。一上来就不是很有思路。看了题解的第一句话尝试去用双指针来想,没有想到在left和right的基础上加一个 i 来遍历查找。
看了题解的整体思路,实现了能解决没有重复元素的数组的代码,最难的还是去重。
首先是给 i 去重:我的大体思路和题解一致,但是忘记了continue的用法,使用的是需要去重时 i++,这就导致很容易使后面的left超出数组的边界。用continue的话可以直接退出当前循环直接开始下一个数的循环。
找到有效结果之后需要让left和right同时缩进一次,因为他们的当前值已经被记录了。
然后是给left和right去重:重点是必须要在找到并记录有效结果之后再给left和right去重,否则会漏掉有效结果。并且在移动到各自的最后一个重复元素之前要一直移动,所以这里用while-loop。
18:
这是一个升级版的3sum,虽然只是多套一层for-loop,但是细节多了不少,需要注意:
- 初始化 i 之后的遍历指针时,要注意如何正确初始化(比如这道题 j = 1就不行,必须是 j = i + 1。
- 给非left和right的遍历指针去重时,用continue!不要用 ++ !
- 给非left和right的遍历指针去重时,一定要在各自的for-loop里面操作,不要窜位。
- 在给第一个之后的遍历指针去重时( i 之后就是j、k等)一定要注意去重的条件(比如这道题里 j 的去重条件之一就必须是 j > i + 1。
- 在数值会很大的时候,把sum转换成long 或者 用剪枝提前退出的办法来防止overflow。