求和问题总结
题目列表
- 2 sum
- 2 sum II - input array is sorted
- 2 sum III - data structure design
- 3 sum
- 3 sum closest
- 3 sum smaller
- 4 sum
- k sum
- k sum II
问题描述
一般是给一组n个数字,给1个target, 求出k个数字的sum为target. 有变化的题目就是求closest,求个数,求组合等等
注意事项
- 可能有重复项,注意去掉重复的组合, 除了2sum的题目最好先sort一下,这样可以方便去掉重复的项
- sort方法枚举的时候注意不要重复,就像subsets一样
2 sum 解法
方法1 - brute force
枚举所有的k-subset, time complexity就是从N中选出k个, O(n^k)
方法2 - 先sort,再two pointer
O(NlogN + N) = O(nlogn), 要注意的是sort了之后就改变了原来的顺序
方法3 - hashmap O(n)
对于2 sum来说,其实就是对于每一个element nums[i]
, 在数组中找是否存在target - nums[i]
用hashmap保存访问过的value, 对每个num[i]
,检查hashmap中是否有target - nums[i]
,扫完一遍就能够得到结果。属于用空间换时间。
time complexity - O(n)
space complexity - O(n)
后续题目
对于two sum的题目
- 如果是要返回index,那么优先用hashmap的做,因为不会改变原来array的顺序
- 如果是返回元素的value,那么可以用先sort然后two pointer的方法
对于3sum, 3sum closest, 4sum等题目,因为大部分都是根据two sum two pointer做法的延伸,所以都是要求return value
summary
two pointer
two pointer做法有利于跳过重复元素,用来计算closest, smaller等等不等于target的题目,所以优先使用
3 sum 解法
3 sum 可以退化为2 sum, 先取出一个数i, 然后在剩下的数组中找sum为target - i
的就可以了。
这里要注意的是不管采取sort还是hashmap的方法,时间复杂度其实都是O(n^2)
. hashmap的大家都知道,排序的解释如下:
排序
sort只sort一遍 O(nlogn), 然后每一个取出一个数,再two pointer寻找的复杂度是O(n^2)
总的复杂度是 O(nlogn + n^2) = O(n^2)
3 sum closest解法
3 sum closest的解法为采取类似3 sum, 但是不要用hashmap, 用sort + two pointer
的方法可以方便的找到closest
4 Sum
4 sum退化为3 sum, 可以用两个for loop内部再2 sum的方法来做
O(n^3)
###hashmap pair(似乎不对,再研究)
还有一种hashmap存pair的方法
- 首先两个for loop,将所有(i, j)的sum作为key, (i, j)作为value存在hashmap里。 ~~
~~- 然后4 sum问题就变成了在这个hashmap里找2 sum的问题
>这种方法要注意重复的index
K sum
K sum也一步步退化,最终变为2 sum
K sum的时间复杂度是O(n^(k-1))
Reference
- hackersum007
- leon_cai
- sigmainfy 烟客旅人
- 非常详细,有各个题目的各种情况分析