找到排序数组值之间的最大差异

时间:2013-06-18 14:50:18

标签: javascript arrays algorithm language-agnostic

我有一个可能看起来像这样的数组......

var array = array(1,4,7,8,12,15);

数组中的值将始终为整数,并且总是会上升,或者可能与前一个相同,但至少不会变得更少。

现在我想循环遍历数组并找出哪个“步骤”之间有最大的区别,所以在我的例子中,数组键4& 5从8-12 == 4 ...但是也可能会发生这是多个步骤,具有相同的值,假设我的数组将是这个..

var array = array(1,5,7,8,12,15);

然后它将是0& 1和4& 5 ....

我正在寻找能让我回复的功能......哦,它必须是PureJs ......

我希望有人可以帮助我。

3 个答案:

答案 0 :(得分:3)

我不确定你想要什么。但如果你想要最大的跳跃:

var max=0;
for (i=1; i<array.length; i++)
    max = Math.max(max,array[i]-array[i-1]);

如果您想要出现最大跳跃的第一个位置:

var max=0;
var firstLoc=0;
for (i=1; i<array.length; i++)
{
    curJump = array[i]-array[i-1];
    if (curJump > max) 
    {
        firstLoc = i;
        max = curJump;
    }
}

如果您想要发生此跳转的最后位置:

var max=0;
var lastLoc=0;
for (i=1; i<array.length; i++)
{
    curJump = array[i]-array[i-1];
    if (curJump >= max) 
    {
        lastLoc = i;
        max = curJump;
    }
}

如果你想要一个发生这种最大跳跃的所有位置的数组:

var max=0;
var locs = [];
for (i=1; i<array.length; i++)
{
    curJump = array[i]-array[i-1];
    if (curJump == max)
    {
        locs.push(i);
    } else if (curJump > max)
    {
        locs = [i];
        max = curJump;
    }
}

答案 1 :(得分:2)

一种功能性方法利用简单的纯函数和内置函数来完成一些繁重的工作:

var array = Array(1,5,7,8,12,15);

//get differences:
var diffs=array.map(function(a,b,c){
 return a - (c[b-1]||0);
},{});

//find max diff and collect elements:
var rez=diffs.map(function(a,b){return a==this && [b-1, b]; }, 
                   Math.max.apply(0, diffs)
            ).filter(Boolean);

//display the findings:
alert(rez.join("|")) //shows: 0,1|3,4

当我完成后我总是感到惊讶,而且我没有看到任何当地的变种或条件被使用......

答案 2 :(得分:1)

蛮力解决方案是按顺序通过数组并查看从[i]到[i + 1]的差异。如果它大于max,则将max设置为该值。

由于数组已排序,因此也可能进行二进制搜索。