四个数相加比起四个数和要简单很多,其中就包括不需要考虑去重等等问题,
相加时候只要分两个for loop,一个用来求前两个数的合,并把这些值放到map中,
map的key是数值,value是出现的次数。在后两个数求和的时候,去map中查找 (0 - 求和值)的值的出现次数。最后通过totalcount累加起来得到最后的答案。
在判断完notesize>magazinesize后,使用magazine去添加字典,在使用note起减少字典中的个数
如果一个key的value在减少后小于0,代表个数不够,返回false。
哈希表方法:
在排序后,首先对于第一个数字(a)进行剪枝筛选,当排序后第一个数字大于0是直接返回。
当开头一样时,需要跳过。之后就是对于(b)(c)数字进行去重,
对于b这个数,由于可能会出现类似于-2,1,1这样的情况 所以不能单纯用nums[j] == nums[j-1]筛选,对于下面的c来说
其实每次的c都是之前添加进来的b,以 1 2 3为例子,在2在set中并没有找到时,会把2放入set中,直到后面c等于2的情况,就把set中的2去掉,形象一点的理解就是2这个元素用过了,就扣掉了,之后不能再使用了。
双指针的方法:
比起哈希表,双指针的方法就非常的直接。
在第一个数的筛选上是一样的,后面的逻辑
相当于在当前第一个数的后面有一个大的滑块,当值太大时候 右侧像左移 减小值,当值太小时,左侧向右移 增大值。在正好相等的时候,记录结果。之后两个while是用来过滤相同值的,但是由于right,left位置都在变所以我们要同时确认两个边界不会碰到。在确认完之后,缩小范围。假设left是a right是b,如果a b作为了答案,其他答案只有可能是有更大的a和更小的b一起组成的。
这个于3数和其实都差不多,只是又多了一层,由于target可能不为0了,所以会有稍微的变化。