Marco de resolución de problemas de seguimiento de algoritmos

1. Introducción a los problemas de retroceso

El problema del retroceso es el proceso transversal del árbol de decisiones. El problema del retroceso debe considerar las siguientes preguntas

  • Ruta: la elección que se ha hecho, es decir, la ruta desde el nodo raíz al nodo actual

  • Lista de selección: qué otras opciones se pueden hacer en la situación actual, es decir, continuar atravesando los nodos y qué caminos se pueden tomar.

  • Condición final: llegar al nodo hoja del árbol de decisiones o detenerse si no se cumple la condición

2. Marco de problemas de retroceso

Después de comprender varios aspectos del problema del retroceso, veamos el marco básico del retroceso

List<String> result = new ArrayList<String>();
public void backtrack(已经选择的路径,可以做选择的列表) {
  if (满足结束条件)
    result.add(已经选择的路径);
    return;

   for 选择 in 可以做选择的列表 {
     选择列表.remove(选择);
     已经选择的路径.add(选择);
     backtrack(已经选择路径,可以做选择的路径);

     //撤销
     已经选择的路径.remove(选择);
     可以做选择的列表.add(选择);
   }
} 

3. Caso

La óptica no practica los mangos falsos. Antes de ver la idea, escríbala usted mismo y vea si hay espacio para la optimización.

3.1 Arreglo completo de cadenas

Dada una secuencia de números sin repetición , devuelve toda la matriz completa posible. Fuente: https://leetcode-cn.com/problems/permutations/

Ejemplo:

//输入: [1,2,3]
//输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
class Solution {

    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        int[] visited = new int[nums.length];
        backtrack(res, nums, new ArrayList<Integer>(), visited);
        return res;

    }

    private void backtrack(List<List<Integer>> res, int[] nums, ArrayList<Integer> tmp, int[] visited) {
        if (tmp.size() == nums.length) {
            res.add(new ArrayList<>(tmp));
            return;
        }
        for (int i = 0; i < nums.length; i++) {
            if (visited[i] == 1) continue;
            visited[i] = 1;
            tmp.add(nums[i]);
            backtrack(res, nums, tmp, visited);
            visited[i] = 0;
            tmp.remove(tmp.size() - 1);
        }
    }
}

Nota : donde resestá el retorno general, tmp es un nodo en la ruta actual, visitedy numspara identificar cuáles son los nodos actuales a los que puede acceder

3.2 Dirección IP legal

Dada una cadena que contenga solo números, restáurela y devuelva todos los formatos de dirección IP posibles. Fuente: https://leetcode-cn.com/problems/restore-ip-addresses/

Una dirección IP válida consta de exactamente cuatro números enteros (cada número entero está entre 0 y 255 y no puede contener un 0 a la izquierda) y los números enteros están separados por ".".

Por ejemplo: "0.1.2.201" y "192.168.1.1" son direcciones IP válidas, pero "0.011.255.245", "192.168.1.312" y "[email protected]" son direcciones IP no válidas.

Ejemplo 1:

Entrada: s = "25525511135" Salida: ["255.255.11.135", "255.255.111.35"] Ejemplo 2:

Entrada: s = "0000" Salida: ["0.0.0.0"] Ejemplo 3:

Entrada: s = "1111" Salida: ["1.1.1.1"] Ejemplo 4:

Entrada: s = "010010" Salida: ["0.10.0.10", "0.100.1.0"] Ejemplo 5:

输入 : s = "101023" 输出 : ["1.0.10.23", "1.0.102.3", "10.1.0.23", "10.10.2.3", "101.0.2.3"]

Resuelve el código

class Solution {
    public List<String> restoreIpAddresses(String s) {
        List<String> res = new ArrayList();
        List<String> temp = new ArrayList();
        helper(res,temp,s);
        return res;
    }

    void helper(List<String> res,List<String> temp,String next) {
        if(temp.size() > 4) {
            return;
        }
        if(temp.size() == 4 && next.length() == 0) {
            String ip = temp.get(0) + "." + temp.get(1) + "." + temp.get(2) + "." + temp.get(3);
            res.add(ip);
            return;
        }
        for(int i = 0; i < next.length(); i++) {
            String s = next.substring(0,i+1);
            if(s.length() > 1 && s.charAt(0) == '0') {
                continue;
            } 
            if(s.length() > 3) {
                continue;
            }
            if(s.length() == 3 && "255".compareTo(s) < 0) {
                continue;
            }
            temp.add(s);
            helper(res,temp,next.substring(i+1));
            temp.remove(temp.size() - 1);
        }
    }
}

Nota : El marco general todavía adopta la estructura anterior, pero al juzgar si el nodo actual debe agregarse a la temperatura, se debe hacer un juicio un poco más complicado. Wu Xie, Xiao San Ye, un pequeño novato en segundo plano, big data, e inteligencia artificial. Presta atención a másarchivo

Supongo que te gusta

Origin blog.csdn.net/hu_lichao/article/details/112145591
Recomendado
Clasificación