[Backtracking] [leetcode] Encuentra todas las combinaciones de k números que suman n

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:

216. Suma combinada III

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();
        }
    }
};

 

Supongo que te gusta

Origin blog.csdn.net/hbuxiaoshe/article/details/114825220
Recomendado
Clasificación