[Leetcode] Conjunto detallado de preguntas diarias seleccionadas: ¿qué? ¿Quieres eliminar mi elemento?

        Hola a todos, soy el chef Yuan (porque me encanta cocinar, obtuve mi certificado de chef). He estado leyendo blogs escritos por todos antes y aprendí mucho. Luego, recientemente, desarrollé una idea que escribí y compartiré lo que sé con los estudiantes que lo necesitan. En el futuro, compartiré varias soluciones de los temas seleccionados de Leetcode y algunas pequeñas demostraciones de Python, JS, JQ, CSS, PHP, JAVA todos los días. Por favor, presten atención e intercambien y estudien juntos.


     Mis compañeros, recientemente tuve un plan a largo plazo para ordenar los temas de Leetcode, de simples a profundos, de simples a complejos. Es un gran proyecto, así que planeo ordenar uno o dos temas clásicos todos los días para completar este. Proceso Creo que definitivamente ganaremos mucho. Si desea formar un equipo con amigos, podemos registrar el grupo juntos y progresar juntos. Puedes agregarme a WeChat tan45du_one o escanear el código QR en el resumen.

Descripción del Título

Inserte la descripción de la imagen aquí


Solución violenta

Inserte la descripción de la imagen aquí

Ideas de preguntas

Este problema puede considerarse como un problema simple, adecuado para principiantes, y luego no todos deberían despreciar la solución violenta, podemos escribir la solución violenta primero y luego pensar en otros métodos, lo cual es de gran ayuda para nuestra capacidad de codificación. Analicemos la idea de esta pregunta. Su significado es dejarnos eliminar los elementos en la matriz y luego seguir los elementos detrás de la matriz. Finalmente, devuelva la longitud de la matriz con los elementos eliminados. Por ejemplo, la longitud de la matriz es 10, y hay 2 valores objetivo en ella. La longitud que finalmente devolvemos
es 8, pero los 8 elementos devueltos deben estar en la parte superior de la matriz. Luego, la solución de fuerza bruta requiere dos bucles for, uno para buscar y eliminar, y el otro para actualizar la matriz.
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
La idea general es esta, y esta última se seguirá cubriendo en el futuro. La solución de fuerza bruta tampoco se detiene, y la implementación no es demasiado simple. Hay dos puntos principales a tener en cuenta.
(1) Debe definir la variable len para obtener la longitud de la matriz, porque la longitud de la matriz devuelta cambiará más adelante, por lo que no se pueden usar nums. Longitud como límite superior
(2) Siempre que encontremos un valor que deba eliminarse, necesitamos i-- para evitar la aparición de múltiples valores que deben eliminarse juntos y luego omitir la eliminación.

Código de tema

El código también es relativamente simple

class Solution {
    
    
    public int removeElement(int[] nums, int val) {
    
    
        //特殊情况需要注意
        if(nums.length == 0){
    
    
            return 0;
        }
        //获取数组长度,作为for循环的上界
        int len = nums.length;
        for(int i = 0; i < len ; i++){
    
    
            //找到需要删除的元素
            if(nums[i]==val){
    
     
               //覆盖需要删除的元素               
                for(int j = i+1 ; j < len ; j++){
    
    
                    nums[j-1] = nums[j];
                }
                //保留当前索引,防止漏删
                i--;
                //缩小需要返回的长度
                len--;                
            }
        }
        return len;
    }
}

Puntero de velocidad

Inserte la descripción de la imagen aquí

Ideas de preguntas

El método de punteros rápidos y lentos es más interesante. Solo se necesita un bucle for para resolver el problema. La complejidad temporal es O (n). La idea general es tener dos punteros. El primero va seguido del otro. El anterior se utiliza para buscar el valor a eliminar. Cuando alcanza el valor que debe eliminarse, el puntero frontal salta directamente y el puntero trasero no se mueve.Cuando se encuentra un valor normal, ambos punteros se mueven y modifican el valor del puntero lento. Finalmente, simplemente genere el índice del puntero lento.
Inserte la descripción de la imagen aquí

Código de tema

El código es relativamente simple, puedes consultarlo.

class Solution {
    
    
    public int removeElement(int[] nums, int val) {
    
    
    //特殊情况
      if(nums==null){
    
    
          return 0;
      }     
      int j = 0;//慢指针,i代表快指针
      for(int i = 0;i<nums.length;i++){
    
    
         //正常情况直接赋值给i          
          if(nums[i]!=val){
    
    
              nums[j]=nums[i];
              j++;
          }
          //如果为需要删除的值时,则快指针移动,慢指针不动。
      }
       return j;
    }
}

para resumir

En términos generales, esta pregunta es bastante buena. Se puede considerar que abre la puerta a punteros dobles. Habrá muchos problemas de punteros dobles en el futuro. Por favor, agregue a mis amigos a las preguntas.
.

Autor: LeetCode
enlace: https: //leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
Fuente: botón de estancia (LeetCode)
derechos de autor reservados por los autores. Para reimpresiones comerciales, comuníquese con el autor para obtener autorización. Para reimpresiones no comerciales, indique la fuente.

Supongo que te gusta

Origin blog.csdn.net/tan45du_yuan/article/details/109046609
Recomendado
Clasificación