算是经典算法问题了。这里主要针对只存在一个解或者只需要求一个解的情况描述一下解题思路。若需要找到所有可能解,方法需要略作调整。如有问题,欢迎指正。

2 sum:

如果已排序,可直接用夹逼法,即两指针从头尾向中间移动,使和靠近target。时间复杂度为O(n)。

若未排序,因为除非有特别限制,比较排序的时间复杂度为O(nlgn)。此时用hash更为合适,可以达到O(n)的时间复杂度。此方法实际上对已排序数组也实用。步骤如下:

每一个数a在放入hash表前,判断目标target-a是否在hash 表内,如果在,则找到解。否则将a放入表中。

这种方法比先完整构建hash表再检查少扫描一遍数组。

k sum(k>=3):

  一个通用的方法就是先排序,然后依次固定序列中的一个数,对其后的所有数递归做k-1 sum。这样的时间复杂度是O(nk-1)。

4 Sum:

除了上面k sum的方法外,另一个方法是降到k/2=2 sum。方法大致如下:

把原数组的元素两两求和(非相同序号,个数为O(n2)),记录在一个结构体单元内,其中包含此和以及对应两元素的原始index,时空复杂度均为O(n2)

以两两和为关键字进行排序,时间复杂度O(n2logn)

再用夹逼求2 sum,若两值包含某相同下标(最多四次比较)则跳过,指针按上次方向继续移动。复杂度O(n2)。

所以总的复杂度为O(n2logn)。同样,若最后的夹逼若改为hash,可到O(n2)。

理论上讲,这种方法也许也可以推广到更高价k=2m sum,但是这是一种空间换时间的方法,空间增长很快,而且因为涉及判断下标是否重复,逻辑真的有点复杂。。。

3-Sum Closest

与3 sum类似,但固定一个数后,用夹逼时,记录两个数的和与当前target的差。时间复杂度仍然为O(n2)。

若需要找到所有可能解且元素有重复时,使用上述通用方法,在做递归的过程中,若当前求k sum,重复元素个数为m,则根据和中包含0~min(k,m)个此元素继续递归即可。

K Sum(2 Sum,3 Sum,4 Sum,3-Sum Closest)的更多相关文章

  1. [LeetCode] 112. Path Sum ☆(二叉树是否有一条路径的sum等于给定的数)

    Path Sum leetcode java 描述 Given a binary tree and a sum, determine if the tree has a root-to-leaf pa ...

  2. 实现一个函数功能:sum(1,2,3,4..n)转化为 sum(1)(2)(3)(4)…(n)?

    // 使用柯里化 + 递归function curry ( fn ) {  var c = (...arg) => (fn.length === arg.length) ?           ...

  3. [LeetCode] Max Sum of Rectangle No Larger Than K 最大矩阵和不超过K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...

  4. Subarray Sum & Maximum Size Subarray Sum Equals K

    Subarray Sum Given an integer array, find a subarray where the sum of numbers is zero. Your code sho ...

  5. Leetcode: Max Sum of Rectangle No Larger Than K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...

  6. Max Sum of Rectangle No Larger Than K

    Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix s ...

  7. [LeetCode] Partition to K Equal Sum Subsets 分割K个等和的子集

    Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...

  8. [LeetCode] Subarray Sum Equals K 子数组和为K

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  9. [Swift]LeetCode698. 划分为k个相等的子集 | Partition to K Equal Sum Subsets

    Given an array of integers nums and a positive integer k, find whether it's possible to divide this ...

  10. [Swift]LeetCode862. 和至少为 K 的最短子数组 | Shortest Subarray with Sum at Least K

    Return the length of the shortest, non-empty, contiguous subarray of A with sum at least K. If there ...

随机推荐

  1. 【python】-- web开发之jQuery

    jQuery jQuery 是一个 JavaScript 函数库,jQuery库包含以下特性(HTML 元素选取.HTML 元素操作.CSS 操作.HTML 事件函数.JavaScript 特效和动画 ...

  2. spark在yarn-cluster上面执行报错

    在单机模式下执行成功的spark程序,在yarn上面就报错.异常信息如下: // :: INFO DAGScheduler: Completed ResultTask(, ) // :: INFO D ...

  3. Android Theme主题

    •android:theme="@android:style/Theme.Dialog" 将一个Activity显示为能话框模式 •android:theme="@and ...

  4. Data Structure Linked List: Write a function to reverse a linked list

    iterative太简单不写了 http://www.geeksforgeeks.org/write-a-function-to-reverse-the-nodes-of-a-linked-list/ ...

  5. Data Structure Binary Tree: Inorder Tree Traversal without recursion and without stack!

    http://www.geeksforgeeks.org/inorder-tree-traversal-without-recursion-and-without-stack/ #include &l ...

  6. javascript箭头函数把函数给简写了[0403]

    箭头函数把函数给简写了[0403]        我不是很喜欢箭头函数,总觉得它让原本就不那么严谨的js更加不严谨了,所以有时候看js程序也是一件很头痛的事情,不过在ES6中加入了这么一个新的方法,已 ...

  7. 20145210姚思羽《网络对抗技术》逆向及Bof基础实践

    20145210姚思羽<网络对抗技术>逆向及Bof基础实践 实践目标 1.本次实践的对象是一个名为pwn1的linux可执行文件. 2.该程序正常执行流程是:main调用foo函数,foo ...

  8. 20165101 学习基础和C语言基础调查

    学习基础和C语言基础调查 技能学习心得 看了15级学长学姐丰富的技能之后,我感到很惭愧.我的课外技能可以说是很糟糕.唱歌的话,小时候还可以用假声唱一下,变声之后就是高音上不去,低音下不来.体育更是差劲 ...

  9. TCP相关知识总结

    参考: http://coolshell.cn/articles/11564.html http://coolshell.cn/articles/11609.html TCP头格式 接下来,我们来看一 ...

  10. 国内ADSL用户的带宽一般都是1M、2M、3M的,理论上的下载速度分别是128K/S、256K/S、384K/S。

    国内ADSL用户的带宽一般都是1M.2M.3M的,理论上的下载速度分别是128K/S.256K/S.384K/S. 1024/8===128      2048/8==256