2016-01-03 2 views
0

Я работаю над созданием функции, которая при задании списка чисел и целевого номера возвращает сумму индексов списка, связанных с номерами, которые могут быть сопряжены с одним другим числом в список для создания целевого номера. Когда это возможно, эту сумму следует минимизировать.Алгоритм для нахождения суммы суммирующих пар idexes

Например, f([0, 0, 0, 0, 1, 1], 1) должен возвращать 10, потому что есть две пары чисел, сумма которых равна единице, а наименьшие значащие индексы этих пар - (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

очень интересный. позвольте мне посмотреть, могу ли я попытаться исправить вас algo –

+0

Основная проблема с попарно ([1,1,1], 2) заключается в том, что вы уже установили log [j] равным 1 (что является вторым индексом) и вы не сбросите его для проверки во второй раз, когда вводится внешний цикл. ваш цикл суммирования, вероятно, должен быть внутри i-го цикла и соответствующим образом скорректирован –

ответ

2

Чтобы избежать сравнения элемента с самим собой, вы должны использовать:

for (i = 0; i < arr.length-1; i++) 
    { 
    for (j = i+1; j < arr.length; j++) 
Смежные вопросы