454.四数相加
思路:代码随想录
思路:使用unordered_map来存放A+B的值以及出现的次数,本题无需去重。接着在遍历C+D数组找到0-(c+d)。因为0-(c+d) = a+b。如果这个目标值在map出现过 计数器就加上key所对应的value。
383.赎金信
思路:代码随想录
思路:定义一个大小为26的数组并初始化为0来映射小写字母。数组是本题最合适的数据结构。先把杂志出现的字母映射到数组中,再把赎金信中出现的字母在数组中做减减,如果发现当前遍历到的字母在数组中的值为负数说明没有出现过直接返回false。
15.三数之和
思路:代码随想录
思路:本题使用双指针。定义一个left指向i+1,right指向数组最后一个元素。
依然还是在数组中找到 abc 使得a + b +c =0,我们这里相当于 a = nums[i],b = nums[left],c = nums[right]。
接下来如何移动left 和right呢, 如果nums[i] + nums[left] + nums[right] > 0 就说明 此时三数之和大了,因为数组是排序后了,所以right下标就应该向左移动,这样才能让三数之和小一些。
如果 nums[i] + nums[left] + nums[right] < 0 说明 此时 三数之和小了,left 就向右移动,才能让三数之和大一些,直到left与right相遇为止。
对i去重需要判断i和i-1是否相等。对 b,c去重要先至少收获一个结果之后再去重 判断left和left+1是否相等 是的话就left++,right是否和right-1相等 是的话就right--。最后 两个指针同时向中间移动。