在JavaScript中将O(n ^ 3)更改为O(n ^ 2)

参见英文答案 > Finding three elements in an array whose sum is closest to a given number13个
我正试着在编码解决方案中节省时间.

我有一个名为tripletSum的函数,它接受两个参数x和a,其中x是数字,a是数组.

如果列表a包含三个加起来为x的元素,则该函数应返回true,否则返回false.

我创建了以下工作解决方案:

function tripletSum(x,a) {
    for(var i = 0; i < a.length; i++) {
        for(var j = i + 1; j < a.length; j++) {
            for(var k = j + 1; k < a.length; k++) {
                if((a[i] + a[j] + a[k]) === x) {
                    return true;
                }
            }
        }
    }
    return false;
}

但这似乎不是最好的做法.目前运行此函数所需的时间是O(n ^ 3),如果我没有弄错,我认为可以改进O(n ^ 2)的时间复杂度.

无论如何,我可以改变这个代码来做到这一点?

编辑:这不是另一个问题的重复,因为我要求对我当前在JavaScript中的示例进行具体改进,这不是它在标记的重复问题中提出的要求.

解决方法

这是一个想法:首先需要对数组进行排序.之后,您可以有一个循环遍历从0到N-2(排他性)的所有元素.让我们称之为这个循环的索引.这就是数组排序的有用之处.我们将使用数组排序的知识来“挤压”“未处理的”子阵列(范围从i 1到第N个元素).您现在将左右两个值. left将指示未处理子数组的左索引,而right将指示数组未处理部分的正确索引.在开始时我们设置left = i 1和right = N – 1.我们计算总和a [i] a [left] a [right].现在我们有3个案例:

>如果sum = x则返回true
>如果总和> x然后我们需要降低总和,所以我们需要递减1(从右边挤压)
>如果总和< x然后我们需要使总和更大,所以我们需要向左递增1(从左边挤压)
以下是Javascript解决方案.

function tripletSum(x,a) {
    a.sort(function(i,j) {
        return i - j;
    });

    var N = a.length;

    for(var i = 0; i < N - 2; i++) {
        var left = i + 1,right = N - 1;

        while(left < right) {
            var sum = a[i] + a[left] + a[right];
            if(sum === x) {
                return true;
            }
            else if(sum > x) {
                right--;
            }
            else {
                left++;
            }
        }

    }

    return false;
}

时间复杂度为O(N ^ 2),并且没有使用额外的空间.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: 首先在编辑器里面插入javascript代码: 确定后会在编辑器插入这样的代码: <pre
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代码高亮,因为SyntaxHighlighter的应用非常广泛,所以将kindeditor默认的prettify替换为SyntaxHighlighter代码高亮插件 上一篇“让kindeditor显示高亮代码”中已经
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小
JS怎么获取当前时间戳
JS如何判断对象是否为数组
JS怎么获取图片当前宽高
JS对象如何转为json格式字符串
JS怎么获取图片原始宽高
怎么在click事件中调用多个js函数
js如何往数组中添加新元素
js如何拆分字符串
JS怎么对数组内元素进行求和
JS如何判断屏幕大小
js怎么解析json数据
js如何实时获取浏览器窗口大小
原生JS实现别踩白块小游戏(五)
原生JS实现别踩白块小游戏(一)