2016-07-29 2 views
2

вопрос leetcode является:Комбинации Сумма III на Leetcode

Найти все возможные комбинации к числам, которые добавляют до числа п, учитывая, что можно использовать только цифры от 1 до 9, и каждая комбинация должна быть уникальный набор чисел.

Пример 1:

Входной сигнал: K = 3, п = 7

Выход:

[[1,2,4]]

Пример 2:

Вход: k = 3, n = 9

Выход:

[[1,2,6], [1,3,5], [2,3,4]]

я найти решение в Javascript

var combinationSum3 = function(k, n) { 
    var result = []; 
    search(1, [], k, n); 
    return result; 

    function search(from, prefix, k, n) { 
    if (k === 0 && n === 0) return result.push(prefix); 
    if (from > 9) return; 
    prefix.push(from); 
    search(from + 1, prefix.slice(0), k - 1, n - from); 
    prefix.pop(); 
    search(from + 1, prefix.slice(0), k, n); 
    } 
}; 

Я полагаю, slice (0) возвращает копию исходного массива, поэтому я пытаюсь заменить префикс.slice (0) префиксом. Однако я получаю результат [[]]. В чем проблема?

+0

@AnotherGeek Я не понимаю ваши слова. В консоли Chrome результат: [[]]. Ответ Нины хорошо объясняет. –

ответ

1

Это проблема со ссылкой. Если вы используете срез, вы получаете копию массива. Если вы используете только prefix, то все последующие операции, такие как push или pop, затрагивают массив.

Если вам не нравится работать с копией, вы можете использовать concat, которые также дают новый массив, но с новыми элементами.

Вы код будет выглядеть следующим образом:

var combinationSum3 = function (k, n) { 
 
    var result = []; 
 
    search(1, [], k, n); 
 
    return result; 
 

 
    function search(from, prefix, k, n) { 
 
     if (k === 0 && n === 0) return result.push(prefix); 
 
     if (from > 9) return; 
 
     search(from + 1, prefix.concat(from), k - 1, n - from); 
 
     search(from + 1, prefix, k, n); 
 
    } 
 
}; 
 

 
console.log(combinationSum3(3, 7)); 
 
console.log(combinationSum3(3, 9)); 
 
console.log(combinationSum3(4, 12));

Смежные вопросы