Tabla de contenido
Prefacio
La pregunta de hoy es una lección dolorosa. La idea es correcta, pero se omiten las condiciones del ciclo. Se puede escribir a mano, pero ...
tema
Encuentre la combinación de todas las sumas en una matriz como objetivo
Por ejemplo, la matriz es [2,2,3,4] y target = 7,
entonces todas las combinaciones son
[2,2,3], [3,4]
Ideas
Retrocediendo poda, atravesando todas las situaciones, plantilla dfs pregunta
suma guarda la suma temporal, tmp guarda la combinación temporal, índice recurre a la profundidad actual.
Si suma == objetivo, la tmp actual es una combinación legal y se agrega al conjunto de respuestas.
Si sum + arr [index] ya es mayor que target, no hay necesidad de agregar arr [index] en este momento y regresar directamente. (Esta operación representa la poda)
Si index == arr.length, debe regresar, porque la matriz estará fuera de los límites (esto representa la verificación de la condición de límite)
Es necesario recorrer la posición de cada matriz y todos deben buscar de forma recursiva. Después de la búsqueda, es necesario retroceder para asegurarse de que todas las combinaciones se pueden encontrar en el siguiente nodo.
Si solo se recorre una vez, después de eliminar el primer elemento, no puede continuar buscando todas las combinaciones de forma recursiva desde el segundo elemento.
Código
public class Solution {
//使用Set集合来去重
static Set<List<Integer>> res = new HashSet<List<Integer>>();
static List<Integer> tmp = new LinkedList<Integer>();
public static void main(String[] args) {
int[] arr = {
2,2,3,2,4,1,6,5,2,7,0,1,1,1,1,1,1,1};
int target = 7;
dfs(arr,target,0,0);
printResult(res);
}
public static void dfs(int[] arr,int target,int sum,int index) {
if(sum == target){
res.add(new LinkedList<Integer>(tmp));
return;
}
if(index >= arr.length) return;
if(sum + arr[index] > target) return;
for(int i = index; i<arr.length; i++) {
tmp.add(arr[i]);
dfs(arr,target,sum+arr[i],i+1);
tmp.remove(tmp.size()-1);
}
}
public static void printResult(Set<List<Integer>> res) {
Iterator iterator = res.iterator();
while(iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}
Resultados de la prueba
para resumir
Creo que todo el mundo está familiarizado con el retroceso, pero cuando de repente escribe en el acto, necesita tener una mente más clara antes de codificar el código, piénselo dos veces antes de continuar.
Insista en compartir, insista en la originalidad, ¡las chicas bonitas a las que les gustan los blogueros pueden consultar el blog de la página de inicio del blogger!
¡Tus gustos y favoritos son mi mayor agradecimiento por compartir blogs!
Dirección del blog de Blogger: https://blog.csdn.net/weixin_43967679