【发布时间】:2016-01-04 02:32:17
【问题描述】:
我正在创建一个函数,给定一个数字列表和目标数字,返回与数字相关的列表索引的总和,这些数字可以与列表中的另一个数字配对以创建目标数字。如果可能的话,这个总和应该最小化。
例如,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
【问题讨论】:
-
非常有趣。让我看看我是否可以尝试修复你的算法
-
pairwise([1,1,1], 2) 的主要问题是您已经将 log[j] 设置为 1(这是第二个索引)并且您没有将其重置以针对第二次外部循环进入时进行检查。您的求和循环可能应该在 i 循环内并进行相应调整
标签: javascript algorithm