javascript - 使用javascript查找数组中任意两对元素之间的最小绝对差时出错

标签 javascript html arrays algorithm

我正在尝试解决一个程序,该程序使用 javascript 查找数组中任何一对元素之间的最小绝对差。输入将参数作为数组元素。输出返回数组中任意两个元素之间的最小绝对差值

比如输入为[1,2,4],输出为1

问题的详细描述在this中给出。链接。

在我的代码中,当给出包含 1000 个元素的输入数组时,它会编译并显示因超时而终止,但它适用于较小的输入数组

我认为错误来自性能和复杂性方面的问题。我研究了问题,但我仍然不知道如何继续下一步

我的代码:

    var arr = [..] //array containing 1000 elements
    var count = minimumAbsoluteDifference(arr);
    console.log(count);
    function minimumAbsoluteDifference(arr) {
        var diff = []; var index = 0;
        arr.sort((a, b) => { return (a - b); });
        for (var i = 0; i < arr.length-1; i++){
            for (var j = i+1; j < arr.length; j++){
                if (i != j) {
                    diff[index] = Math.abs(arr[i] - arr[j]);
                    console.log("index", i, j);
                    index++;
                }
            }
        }
        var minAbsoluteDifference = Math.min(...diff);
        return minAbsoluteDifference;
    }

最佳答案

数组排序后,任意两个元素之间的最小绝对差必然在两个相邻元素之间。因此,您可以将嵌套的 for 循环 (O(N^2)) 更改为单个 for 循环 (O(N ))(尽管排序函数仍然是O(N log N),所以整体复杂度只降低到O(N log N)):

function minimumAbsoluteDifference(arr) {
    var diff = [];
    arr.sort((a, b) => a - b);
    for (var i = 0; i < arr.length - 1; i++) {
        if (i < arr.length - 1) {
            diff.push(Math.abs(arr[i] - arr[i + 1]));
        }
    }
    var minAbsoluteDifference = Math.min(...diff);
    return minAbsoluteDifference;
}

这在大多数情况下都有效,但另一个问题是 HackerRank 似乎使用不合理的大数组调用此函数(例如,单个数组中有 100000 个项目),所以

Math.min(...diff)

会导致

RangeError: Maximum call stack size exceeded

改为在每次迭代时调用 Math.min:

function minimumAbsoluteDifference(arr) {
    var lowestDiff = Infinity;
    arr.sort((a, b) => a - b);
    for (var i = 0; i < arr.length - 1; i++) {
        lowestDiff = Math.min(lowestDiff, Math.abs(arr[i] - arr[i + 1]));
    }
    return lowestDiff;

}

关于javascript - 使用javascript查找数组中任意两对元素之间的最小绝对差时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55887147/

相关文章:

javascript - 你如何防止 javascript 中的 Math.random() 多次选择相同的数字?

c++ - 如何创建一个恒定长度的 C++ 整数数组?

c - 指导我将数字除以 10,然后转换为字符串

php - 如何使界面兼容不同的屏幕分辨率

html - 为什么最后一行和倒数第二行之间有一个空格?

javascript - 我正在为我的学校项目创建一个模型电影网站。我有一些与 "select"表单和 JavaScript 代码相关的问题

javascript - RSA Javascript加密和Golang解密

javascript - 如何: Change target URL in iFrame using input text+submit fields & JavaScript

javascript - 如何使用backbone.js构建url?

javascript - 加载商店时如何触发 extjs 3.4 组合的 onSelect?