【LeetCode】 77. Combinación +39. Suma de combinación +40. Suma de combinación II

Enlace del tema: 77. Combinación
Descripción del tema: Dados dos números enteros n y k, devuelve todas las combinaciones posibles de k números en 1 ... n.
Ejemplo:

输入: n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

Idea: solución convencional, recursividad + retroceso, use un índice de inicio de subíndice para indicar el punto de inicio de la búsqueda actual, mientras que la búsqueda registrará el valor actual en esta ruta, después de buscar una ronda de respuestas, retroceder, eliminar el último valor y cambia el camino Sigue buscando.
Código:

class Solution {
    
    
    public void dfs(int n,int startIndex,List<Integer> list,List<List<Integer>> ans,int k){
    
    
        if(k==list.size()){
    
    
            List<Integer> list1=new ArrayList<>(list);
            ans.add(list1);
            return ;
        }
        for(int i=startIndex;i<=n;i++){
    
    
            list.add(i);
            dfs(n,i+1,list,ans,k);
            list.remove(list.size()-1);
        }
    }
    public List<List<Integer>> combine(int n, int k) {
    
    
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        if(n<k||k<=0){
    
    
            return ans;
        }
        List<Integer> list=new ArrayList<>();
        dfs(n,1,list,ans,k);
        return ans;
    }
}

Temas similares: 46. ​​Permutación completa +47. Permutación completa II. Para obtener
más detalles , consulte 39.
Descripción del problema de suma combinada : dada una matriz de candidatos sin elementos repetidos y un número objetivo, busque todos los candidatos que puedan hacer el número suma de la combinación de destino.

Los números de los candidatos se pueden seleccionar repetidamente sin limitación.
Ejemplo:

输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
  [7],
  [2,2,3]
]
输入:candidates = [2,3,5], target = 8,
所求解集为:
[
  [2,2,2,2],
  [2,3,3],
  [3,5]
]

rango de datos:

1 <= candidates.length <= 30
1 <= candidates[i] <= 200
candidate 中的每个元素都是独一无二的。
1 <= target <= 500

Idea: Similar a la idea anterior, excepto que cada elemento aquí se puede reutilizar, por lo tanto, cuando busque, comience desde el nodo actual.
Código:

class Solution {
    
    
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
    
    
        List<Integer> list=new ArrayList<>();
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        dfs(candidates,0,list,ans,target);
        return ans;
    }
    public void dfs(int nums[],int startIndex,List<Integer> list,List<List<Integer>> ans,int target){
    
    
        if(target<0) return;
        if(target==0){
    
    
            ans.add(new ArrayList<>(list));
            return ;
        }
        for(int i=startIndex;i<nums.length;i++){
    
    
            list.add(nums[i]);
            dfs(nums,i,list,ans,target-nums[i]);//可以重复利用每个元素,因此还是从当前位置开始搜
            list.remove(list.size()-1);
        }
    }

}

Enlace de título: 40. Suma de combinación II
Descripción del título: Dada una serie de candidatos y un objetivo de número objetivo, averigüe todas las combinaciones de candidatos que pueden hacer la suma de números objetivo.

Cada número de candidatos solo se puede usar una vez en cada combinación.

  • Todos los números (incluido el número objetivo) son números enteros positivos.
  • El conjunto de soluciones no puede contener combinaciones repetidas.

Ejemplo:

输入: candidates = [10,1,2,7,6,1,5], target = 8,
所求解集为:
[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]
输入: candidates = [2,5,2,1,2], target = 5,
所求解集为:
[
  [1,2,2],
  [5]
]

Idea: Un número solo se puede usar una vez, el método es ordenar el orden primero y luego continuar directamente si dos adyacentes son iguales para evitar que se repita el registro de la respuesta.

class Solution {
    
    
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
    
    
        Arrays.sort(candidates);
        List<Integer> list=new ArrayList<>();
        List<List<Integer>> ans=new ArrayList<List<Integer>>();
        dfs(candidates,target,list,ans,0);
        return ans;
    }
    public void dfs(int []nums,int target,List<Integer> list,List<List<Integer>> ans,int startIndex){
    
    
        if(target<0) return;
        if(target==0){
    
    
            List<Integer> list1=new ArrayList<>(list);
            ans.add(list1);
            return;
        }
        for(int i=startIndex;i<nums.length;i++){
    
    
            if(i>startIndex&&nums[i] == nums[i-1]) continue;//避免出现重复情况
            list.add(nums[i]);
            dfs(nums,target-nums[i],list,ans,i+1);
            list.remove(list.size()-1);
        }
    }
}

Supongo que te gusta

Origin blog.csdn.net/dl962454/article/details/115023866
Recomendado
Clasificación