
前几天偶尔看到一道题,感觉蛮有意思的,在自己思考,外加上网查询之后,找到了一个比较完美的算法解决。问题描述如下:
给定有序排列的N个整数,找出其中3个数相加和为0,输出所有的不重复的3个数,要求输出的结果依然有序。
在单行内,输出的顺序和原来一致,每行之间的顺序和第一个数字在原数列中的顺序一致(如果相同则向后依次比较)
INPUT :
5
-2 -1 0 1 2
OUTPUT:
-2 0 2
-1 0 1
INPUT :
5
2 2 0 -2 -4
OUTPUT:
2 2 -4
2 0 -2
思路
首先思考:寻找有序数组(下文说的数组均是升序排列的)中两个和为 k 的值。很简单,两个指针 i 和 j 分别指向数组两端,计算两数的和,大于 k 则
j--
,否则i++
,直到寻找到两个数和为 k 或者i > j
时停止。上题中可以转换为寻找数组中两个和为 -k 的数,k 为数组中的元素,我们只需要再加一层循环,遍历数组中的值,作为 k 就可以了。
那么如何解决结果中有重复值的情况呢?比如我们输入 [-4, -2, 0, 2, 2] 这5个数,会输出两次 [-2, 0, 2]。其实这个也很好判断,当我们确定了三个数中的一个数,那么后面求出的两个数就确定下来了,比如我们确定”第一个数”是 -5,那么可能求出后面两个数是 [2, 3] 和 [1, 4],当我们循环到下一个”第一个数”的时候,如果还是 -5,那求出的数据肯定还是重复的,所以直接跳过就好。【这块的描述好像不是很清楚啊!(╯‵□′)╯︵┻━┻ 不明白的话看下面的代码肯定一下子就明白了呢!】
代码实现
1 |
|
文章标题:找出有序数组中 3 个和为 0 的数
文章作者:cylong
文章链接:https://0skyu.cn/posts/c16b.html
有问题或者建议欢迎在下方评论。欢迎转载、引用,但希望标明出处,感激不尽(●’◡’●)
- 本文标题:找出有序数组中 3 个和为 0 的数
- 创建时间:2016-11-08 01:26:19
- 本文链接:https://netlify.076666.xyz/posts/c16b
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!