Javascript 查找差异大于或等于给定数字的对数

Javascript 查找差异大于或等于给定数字的对数,javascript,arrays,algorithm,sorting,dictionary,Javascript,Arrays,Algorithm,Sorting,Dictionary,我有一个正整数数组/dict(HashMap)。 我需要找到绝对差大于或等于给定数K的对数 import random import time #given number k = 4 # List of 2,00,000 random numbers in range 0-1000 strength = [random.randrange(0,1000) for x in range(200000)] strength.sort() # start clock start1 = ti

我有一个正整数数组/dict(HashMap)。 我需要找到绝对差大于或等于给定数K的对数

import random
import time

#given number
k =  4

# List of 2,00,000 random numbers in range 0-1000
strength = [random.randrange(0,1000) for x in range(200000)]  
strength.sort()

# start clock
start1 = time.clock()

n = len(strength)

# count keeps track of number of pairs found
count = 0

for x in range(n):
    for y in range(x,n):

        if abs(strength[x] - strength[y]) >= k:
            # if found, all number from this point to the end will satisfy
            count += n-y
            # So no need to go to the end
            break

end1 = time.clock()
print(count)
print(end1-start1)
我找到的所有答案都是针对小于或等于给定数字的配对


我需要找到绝对差值大于或等于给定数K的对的数目。

注意,对的总数是
n*(n-1)/2
,因此如果你能找到差值小于
K
的对的数目,差值大于
K
的对的数目就是
n*(n-1)/2-num\u对,其差异小于

import random
import time

#given number
k =  4

# List of 2,00,000 random numbers in range 0-1000
strength = [random.randrange(0,1000) for x in range(200000)]  
strength.sort()

# start clock
start1 = time.clock()

n = len(strength)

# count keeps track of number of pairs found
count = 0

for x in range(n):
    for y in range(x,n):

        if abs(strength[x] - strength[y]) >= k:
            # if found, all number from this point to the end will satisfy
            count += n-y
            # So no need to go to the end
            break

end1 = time.clock()
print(count)
print(end1-start1)

您提供的解决方案也是正确的(并且有很好的文档记录)。如果您的问题是如何使其适应您的情况,那么您需要做的就是使用
HashMap
(排序)的值代替
强度
数组。

您可以获得数组的2项组合,然后根据差异过滤/减少它们

我们可以用JavaScript做如下工作:

Array.prototype.combines=函数(n){
返回这个.reduce((p,c,i,a)=>p.concat(n>1?a.slice(i+1).组合(n-1).映射(e=>e.push(c,e))
:[[c]],[]);
};
函数getAcordingToDiff(a,d){
返回a.组合(2)
.reduce((p,c)=>Math.abs(c[0]-c[1])>=d?(p.push(c,p):p,[]);
}
var arr=Array(30).fill().map((uu,i)=>i+1);//来自[1,…,30]的数组
log(JSON.stringify(arr))

log(JSON.stringify(getAcordingToDiff(arr,25)));//diff>=25
创建一个1001个元素的数组,数组中的整数初始化为零。生成随机整数,并为每个这样的整数增加相应的索引1。通过一些数学运算,您可以在不生成2000000个随机整数的情况下完成此操作,但这并不值得这么复杂

创建第二个1001元素整数B s.t.B[i]=a[0]+…+a[i]


答案是从i=0到1000-k的B[i]*(2000000-B[i+k-1])之和

你的问题是什么?@hatchet编辑了这个问题,这是我的另一个问题,我找不到一个只包含严格小于K的对的解决方案,我找到的或能够编码的所有内容都包含相同的大小写。@redus你能用更简单一点的语言告诉我你做了什么吗,因为我不懂JS,我需要用python编码…@duh您必须首先能够获得输入数组的2项组合。我确信Python中有很多这样做的示例。然后您所要做的就是减少/过滤差值大于或等于给定
d
值的组合。我将在几个小时后解释组合函数,因为现在我已经e离开办公室。@redus当然可以,慢慢来。你的意思是让数组中所有可能的2项组合都成为?然后检查两个数字之间的差值是否大于或等于给定的d值?@duh我试图解释算法,最后将所有作业打包在一个函数中。在我的最后一段代码中,我发现生成组合数组时,在运行中使用正确数量差异的组合。答案的扩展部分对此进行了解释。@redus我的数组的长度约为200000个数字,我必须在5秒内获得。