tema:
Encuentra todas las combinaciones de k números que sumen n. Solo se permiten números enteros positivos del 1 al 9 en la combinación y no hay números repetidos en cada combinación.
Descripción:
- Todos los números son enteros positivos.
- El conjunto de soluciones no puede contener combinaciones repetidas.
Ejemplo:
Entrada: k = 3, n = 7
Salida: [[1,2,4]]
fuente:
Ideas para resolver problemas: retroceder
Continuamos respaldando la idea de aprendizaje, este problema con el anterior (todas las combinaciones) es muy similar a una referencia directa.
- Condición de terminación recursiva: satisfaga el número k
- Condición de salida del resultado: satisfacer el número k && satisfacer la suma
- Condición de poda: aunque el número actual es menor que k, la suma pronto excederá el valor objetivo
código c ++:
class Solution {
public:
vector< vector<int> > result;
vector<int> path;
vector< vector<int> > combinationSum3(int k, int n) {
back(n, 0, k, 1);
return result;
}
// targetSum:目标和,固定值
// currentSum:当前path中的数字和,动态累加
void back(int targetSum, int currentSum, int k, int start) {
if (path.size() == k) {
if (currentSum == targetSum) {
result.push_back(path);
}
return;
}
for (int i = start; i <= 9; i++) {
if (currentSum + i > targetSum) break; // 剪枝,后面的数字已超出
currentSum += i;
path.push_back(i);
back(targetSum, currentSum, k, i+1);
currentSum -= i;
path.pop_back();
}
}
};