Вопрос в том, чтобы найти все уникальные комбинации в отсортированном массиве, которые суммируются с заданным целевым значением.Для этого примера, скажем, кандидатов = [2,3,6,7] и целевой = 7.Я посмотрел несколько видео, и теперь я понимаю общий алгоритм решения этой проблемы.Я также посмотрел на решение, но у меня возникли некоторые проблемы с визуализацией рекурсивного дерева / каждого рекурсивного вызова в функции.
var combinationSum = function(candidates, target) {
candidates.sort((a,b) => a-b)
let result = []
combSum(candidates, target, [], result, 0)
return result
};
function combSum(candidates, target, current, result, idx) {
let n
for (let i = idx; i < candidates.length; i++) {
n = candidates[i]
current.push(n)
if (n === target) {
result.push([...current])
} else if (target > n) {
combSum(candidates, target-n, [...current], result, i)
}
current.pop()
}
}
Я знаю, что первый шаг состоит в том, чтобы попробовать комбинации, начинающиеся с первого значения в массиве, равного 2. Таким образом, функция попытается [2], затем [2,2], затем [2,2,2], и на данный момент целью является 1, который меньше n, поэтому он пропускает оба оператора if и вытаскивает последние 2.Возвращает ли метод pop () неявный возврат к предыдущему вызову функции в стеке вызовов?Он вернул бы значение 2, которое никогда не использовалось, верно?Там нет базового случая, который сбивает меня с толку.
Кроме того, я знаю, что поскольку массив отсортирован, мы должны знать, что если что-то вроде [2,2,3,3] не работает, то любая другая комбинация, начинающаяся с префикса [2,2,3] тоже не сработает.Хотя я не понимаю, как код решает эту проблему - как он может пропустить эти комбинации?Как [2,2,3,6] и т. Д.
РЕДАКТИРОВАТЬ: Уже очень поздно, я понял в своем первоначальном посте, что я смотрел на другое целевое значение, которое добавляло мне путаницуисправил мой пост, чтобы отразить это.К сожалению !!