码迷,mamicode.com
首页 > 其他好文 > 详细

kSum问题的总结

时间:2015-05-07 14:44:35      阅读:1856      评论:0      收藏:0      [点我收藏+]

标签:ksum   hash_map   two pointers   algorithm   leetcode   


    kSum问题是一类题型,常见的有2Sum,3Sum,4Sum等。这篇博文就来总结一些kSum问题的解法,以及对应的时间复杂度。


    1. 2Sum

    在一个给定的数组nums中,寻找和为定值target的两个数。
    【解法1】:把数组排序,然后使用two pointers的方法来求解。时间复杂度分析:排序O(nlogn),两指针遍历O(n),总体O(nlogn).
    【解法2】:先遍历一遍,把整个数组存入到hash_map中,key是每个数,value是出现的次数。然后再遍历一次,每次取查找hasp_map中是否有target-nums[i]。建立hash_map的时间复杂度是O(n),第二次遍历时 每个查找为O(1),所以查找全部也是O(n),总体为O(n)。注意:如果数组中有重复的数,比如{1, 5, 3, 3}, target=6,那么我们在查找的时候就要考虑3的情况,正是因为数组中有两个3,我们才能返回,此时key=3是的value=2就起到了作用。这就是为什么我们前面要记录value的原因。

    总的来说,2Sum的最好时间复杂度是O(n)。
    
    代码:http://blog.csdn.net/puqutogether/article/details/41775343

    2. 3Sum

    在一个给定的数组nums中,寻找和为定值target的三个数。
    【解法1】:固定其中的一个数a,问题便转换为寻找2Sum,新的target为target-a。时间复杂度为O(nlogn + n^2)=O(n^2)。
    【解法2】:依然是固定其中一个数,之后使用hash_map的做法,时间复杂度还是O(n*n)=O(n^2)。
 
    总体的最好的时间复杂度是O(n^2)。

    3. 4Sum

    一个给定的数组nums中,寻找和为定值target的三个数。
    【解法1】:使用不断固定的思想,最后转化成2Sum问题,时间复杂度为O(n^3).
    【解法2】:既然前面的hash_map的思路展示出优势,那么我们就直接使用hash_map来解决。
                      首先,遍历所有可能的pair,把所有的pair存在hash_map中,key=a+b, value是一个list,每个元素为(a, b)。时间复杂度为O(n^2),为啥是pair呢?因为后面要查找的是pair。
                      然后,两个循环for遍历所有的可能值c和d,O(n^2),每种情况下都需要查找target-c-d,此时,这个差值就是我们hash_map中的key,如果发现有pair满足要求即返回。
                      时间复杂度为O(n^2*logn),因为list的查找至少要O(logn)。所以,解法2的总体时间复杂度为O(n^2logn)。

    4. kSum

    关于kSum问题,我们一样可以使用上述解法1的思路,这样的时间复杂度为O(n^(k-1))。也可以使用hash_map的思路,这样子会更快。具体的时间复杂度分析较复杂,参考如下:

k-SUM can be solved more quickly as follows.

  • For even k: Compute a sorted list S of all sums of k/2 input elements. Check whether Scontains both some number x and its negation ?x. The algorithm runs in O(nk/2logn) time.

  • For odd k: Compute the sorted list S of all sums of (k?1)/2 input elements. For each input element a, check whether S contains both x and a?x, for some number x. (The second step is essentially the O(n2)-time algorithm for 3SUM.) The algorithm runs in O(n(k+1)/2) time.

Both algorithms are optimal (except possibly for the log factor when k is even and bigger than 2) for any constant k in a certain weak but natural restriction of the linear decision tree model of computation. For more details, see:


参考链接:
http://cs.stackexchange.com/questions/2973/generalised-3sum-k-sum-problem.
http://blog.csdn.net/doc_sgl/article/details/12462151


kSum问题的总结

标签:ksum   hash_map   two pointers   algorithm   leetcode   

原文地址:http://blog.csdn.net/puqutogether/article/details/45558445

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!