Является ли мой анализ для этого решения для отслеживания верным?

Я пытаюсь решить следующий вопрос о LeetCode.com:

Учитывая набор номеров кандидатов (C) (без дубликатов) и целевое число (T), найдите все уникальные комбинации в C, где номера кандидатов суммируются с T.

Одно и то же повторное число может быть выбрано из C неограниченное количество раз.
Таким образом, если вход [2, 3, 6, 7] и цель 7тогда вывод должен быть:

[
  [7],
  [2, 2, 3]
]

Высоко проголосованное решение — что-то вроде этого:

class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<int> res;

combinationSumUtil(result, candidates, res, target, 0);
return result;
}

void combinationSumUtil(vector<vector<int>>& result, vector<int>& candidates, vector<int>& res, int target, int start) {
int sum=0;
for(auto each: res) sum+=each;
if(sum==target) {
result.push_back(res);
return;
}
if(sum>target) return;

for(int i=start; i<candidates.size(); i++) {
res.push_back(candidates[i]);
combinationSumUtil(result, candidates, res, target, i);
res.pop_back();
}
}
};

После отладки и попыток понять, что именно происходит, я понял следующее:

  • Как фрагмент включает один и тот же номер два или более раз (как в [2, 2, 3]) — снова позвонив с i (а не, скажем, i+1через start переменная).
  • Как убедиться, что один и тот же набор не включен несколько раз (например, [2, 2, 3] а также [2, 3, 2]) — используя start переменная. Используя эту переменную, мы по существу двигаться вперед. Предположим, что вход [3,2,6,7], Теперь, когда мы сталкиваемся 2мы уже сталкивались 3 до. Итак, когда мы на 2У нас нет возможности встретиться (предыдущая) 3 снова сформировать множество [2, 3, 2], В каждой итерации мы можем встретиться только с текущей или той, которая приходит позже, но не с предыдущей (и вход имеет только отчетливый элементы). Без start переменная, переменная индукции i вероятно, начнется с 0 в каждом рекурсивном вызове (и так, мы также сталкивались с предыдущими значениями (например, 3 в этом случае, когда мы были в настоящее время в 2) приводит к дублированию наборов).

Мой вопрос прост — мое понимание верно?

-1

Решение

Ваше понимание верно, он находит случаи типа 2, 2, 3, повторяя попытку 2, но не любые числа, которые предшествуют 2.

Я бы сказал, что более тип ответа «c ++» использовал бы диапазон итераторов, а не создавал бы копию вектора, и каждый рекурсивный вызов при необходимости использовал бы увеличенную стартовую позицию итератора. Такое решение будет просто начинаться с C.cbegin (), C.cend () и будет принимать предшествующий итоговый параметр, а не «start».

Таким образом, если бы C равнялось 3, 5, 10 и T равнялось 10, он попытался бы использовать комбинации, используя 3 для начала, и не нашел соответствия, затем перешел бы к комбинациям, начинающимся с 5, и попробовал бы сет 5, 10 снова с предыдущим общим количеством ‘5’ , в котором точка 5, 5 будет соответствовать.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]