一道算法优化题,求有序数组是否存在两数之和等于第三个给定的数字

发布于 2022-09-02 09:35:37 字数 135 浏览 8 评论 0

1.题:给出一个函数,判断在一个给定的有序数组中,是否存在两个数之和等于给定的第三个数。

这道题本身挺简单,但是如果直接使用嵌套两个 for 循环的方式去做的话,时间复杂度非常之高。

希望能有大牛给出一个简单的算法优化思路。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时光清浅 2022-09-09 09:35:37

经典的two sum problem,保存双指针,分别指向数组开头和末尾,假设数组非降序排列,分情况讨论:

  1. 如果当前两个数的和等于给定值,成功。

  2. 如果当前两个数的和小于给定值,头指针右移。

  3. 如果当前两个数的和大于给定值,尾指针左移。

如果尾指针跑到了头指针左边则无解。

时间复杂度O(N)

也有其他解法,还有3 / 4 sum problem,很容易搜到。

参考:
http://stackoverflow.com/questions/11928091/linear-time-algorithm-for-2-sum
https://leetcode.com/problems/two-sum/

一杯敬自由 2022-09-09 09:35:37

给一个具体实现吧:


function twoSum (arr, sum) {
    var head = 0,
        len = arr.length,
        rear = len - 1,
        sort = arr[head] > arr[rear] ? "down" : "top",
        grade = {
            down: {
                sub: function () {
                    head++;
                },
                add: function () {
                    rear--;
                }
            },
            top: {
                sub: function () {
                    rear--;
                },
                add: function () {
                    head++;
                }
            }
        };
    while (head < rear) {
        if (arr[head] + arr[rear] === sum) {
            return [arr[head], arr[rear]];
        } else if (arr[head] + arr[rear] <= sum) {
            grade[sort].add();
        } else if (arr[head] + arr[rear] >= sum) {
            grade[sort].sub();
        }
    }
    return "该数组中没有满足要求的两个数字";
}    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文