我正在创建一个函数,给定一个数字和目标数字列表,返回与数字相关联的列表索引的总和,这些数字可以与列表中的另一个数字配对以创建目标数字。如果可能,应该最小化这个总和。
例如,f([0, 0, 0, 0, 1, 1], 1)
应该返回10,因为有两对数字总和为1,这些对的最低值索引是(0,4)和(1,5),以及0+ 1 + 4 + 5 = 10
f([1, 1, 1], 2)
应该产生1 - 最低值求和对索引是(0,1)和0 + 1 = 1
到目前为止,这是我的尝试。我不明白为什么我的算法不适用于第二种情况。我的策略是从最低到最高的索引进行搜索,确保首先记录较低的值索引。
function pairwise(arr, arg)
{
// initiate log with all zeros
var log = [];
for (var i = 1; i <= arr.length; i++)
{
log.push(0);
}
// look for summing pairs
for (i = 0; i < arr.length; i++)
{
for (j = i; j < arr.length; j++)
{
// check if summing pair
if(arr[i] + arr[j] == arg
// also check if either number has been logged
&& log[i] == 0
&& log[j] == 0)
{
log[i] = 1;
log[j] = 1;
}
}
}
// include only indexes with summing pairs in sum
var summ = 0;
for (var i = 1; i < arr.length; i++)
{
summ = summ + log[i] * i;
}
return summ;
}
pairwise([1, 1, 1], 2); // returns 3 not 1
答案 0 :(得分:2)
为避免将元素与自身进行比较,您应该使用:
for (i = 0; i < arr.length-1; i++)
{
for (j = i+1; j < arr.length; j++)