JSFiddle - React, Tailwind, and code Playground
HTML
<div id="div"></div>
JavaScript
var s = [1,4,5,7,8,12]
/*
for (var i=0; i<20000; i++)
s[i] = Math.floor(Math.random()*40000)
*/
s.sort(function(a,b){return a - b})
var len = s.length, halfRange = (s[len-1] - s[0]) / 2
while (s[len-1] - s[len-2] > halfRange){
s.pop()
len--
halfRange = (s[len-1] - s[0]) / 2
}
while (s[1] - s[0] > halfRange){
s.shift()
len--
halfRange = (s[len-1] - s[0]) / 2
}
var n = s.length,
middle = Math.floor((s[n-1] - s[0]) / 2),
largestl = 0,
largestr = 0,
s0 = s[0],
sn = s[n-1],
l = 1
while (largestl < middle){
var tmp = s[l++] - s[0]
if (tmp <= middle) largestl = tmp
else break
}
l = n - 2
while (largestr < middle){
var tmp = sn - s[l--]
if (tmp <= middle) largestr = tmp
else break
}
var largest = Math.max(largestl, largestr)
var maxS = s[n-1],
maxD = 0,
max = 0,
hCount = new Array(largest),
hLast = new Array(largest),
best
var start = new Date().getTime()
for (var i=1; i<n; i++){
for (var j=i-1; j>=0; j--){
var d = s[i] - s[j],
numLeft = n - i,
maxPossible = (maxS - s[i]) / d + 2,
ok = numLeft + 2 >= max && maxPossible >= max
if (d > middle || (d > maxD && !ok))
break
if (hLast[d]){
if (hLast[d] == s[j]){
hLast[d] += d
hCount[d]++
if (hCount[d] > max){
max = hCount[d]
best = {len: hCount[d], d: d, last: hLast[d]}
}
}
else if (ok){
if (d > maxD) maxD = d
hLast[d] = s[i]
hCount[d] = 2
}
}
else if (ok){
if (d > maxD) maxD = d
hLast[d] = s[i]
hCount[d] = 2
}
}
}
var end = new Date().getTime(),
sec = (end-start)/1000
document.getElementById('div').innerHTML += 'tableCount:<br>' + JSON.stringify(hCount)
document.getElementById('div').innerHTML += '<br><br>tableLast:<br>' + JSON.stringify(hLast)
document.getElementById('div').innerHTML +=...