LeetCode Top100 No. 1, 2, 3

1. la suma de dos números

① Descripción del título
  • Dado un número de matriz de enteros y un objetivo de valor objetivo, busque los dos enteros cuya suma es el valor objetivo en la matriz y devuelva sus subíndices de matriz.
  • Puede asumir que cada entrada solo corresponderá a una respuesta. Sin embargo, no puede reutilizar los mismos elementos en esta matriz.
  • Ejemplo:

Dado nums = [2, 7, 11, 15], objetivo = 9
porque nums [0] + nums [1] = 2 + 7 = 9, devuelve [0, 1]

② Solución violenta
public int[] twoSum(int[] nums, int target) {
    
    
    for (int i = 0; i < nums.length - 1; i++) {
    
    
        for (int j = i + 1; j < nums.length; j++) {
    
    
            if (nums[i] + nums[j] == target) {
    
    
                return new int[]{
    
    i,j};
            }
        }
    }
    throw new IllegalArgumentException("No two sum solution");
    
}
③ Dos recorridos hashMap
public int[] twoSum(int[] nums, int target) {
    
    
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
    
    
        map.put(nums[i], i);
    }
    for (int i = 0; i < nums.length; i++) {
    
    
        int complement = target - nums[i];
        if (map.containsKey(complement) && map.get(complement) != i) {
    
    
            return new int[] {
    
     i, map.get(complement) };
        }
    }
    throw new IllegalArgumentException("No two sum solution");
}

2. Suma dos números

① Descripción del título
  • Dadas dos 非空listas enlazadas para representar dos enteros no negativos. Entre ellos, sus respectivos dígitos se almacenan en orden inverso, y cada nodo solo puede almacenar un dígito.
  • Si sumamos estos dos números, se devolverá una nueva lista vinculada para representar su suma.
  • Puede asumir que, a excepción del número 0, ninguno de estos números comenzará con 0.
  • Ejemplo:

Entrada: (2 -> 4 -> 3) + (5 -> 6 -> 4)
Salida: 7 -> 0 -> 8
Razón: 342 + 465 = 807

② Análisis de situación

Inserte la descripción de la imagen aquí

③ Adición de elementos
  • Resumiendo todas las situaciones, primero debemos considerar el acarreo, que puede ser la suma del último dígito, lo que da como resultado una lista más larga.
  • En vista del hecho de que la lista vinculada es nula y la longitud de la lista vinculada es inconsistente, el ||operador se usa inteligentemente y el cálculo de la suma se detiene solo cuando las dos listas vinculadas son ambas nulas.
  • Utilice la lista vinculada auxiliar, una para apuntar al nodo inicial y otra para apuntar al nodo actual.
  • el código se muestra a continuación:
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
    
    
    ListNode result = new ListNode(0);
    ListNode p = l1, q = l2, curr = result;
    int carry = 0;
    while (p != null || q != null) {
    
    
        int x = (p != null) ? p.val : 0;
        int y = (q != null) ? q.val : 0;
        int sum = x + y + carry;
        carry=sum/10;
        curr.next=new ListNode(sum%10);
        curr=curr.next;
        if(p!=null){
    
    
            p=p.next;
        }
        if(q!=null){
    
    
            q=q.next;
        }
    }
    if (carry!=0){
    
    
        curr.next=new ListNode(carry);
    }
    return result.next;
}

3. La subcadena más larga sin caracteres repetidos

① Descripción del título
  • Dada una cadena, averigüe la longitud de la subcadena más larga que no contiene caracteres repetidos.
  • Ejemplo 1:

Entrada: "abcabcbb"
Salida: 3
Explicación: Debido a que la subcadena más larga sin caracteres repetidos es "abc", su longitud es 3.

  • Ejemplo 2:

Entrada: "bbbbb"
Salida: 1
Explicación: Debido a que la subcadena más larga sin caracteres repetidos es "b", su longitud es 1.

  • Ejemplo 3:

Entrada: "pwwkew"
Salida: 3
Explicación: Debido a que la subcadena más larga sin caracteres repetidos es "wke", su longitud es 3.
Tenga en cuenta que su respuesta debe tener la longitud de la subcadena, "pwke" es una subsecuencia, no una subcadena.

② Solución violenta (límite de tiempo excedido)
public int lengthOfLongestSubstring(String s) {
    
    
    if (s.length()==0){
    
    
        return 0;
    }
    int max=1;
    for (int i=0;i<s.length()-1;i++){
    
    
        for (int j=i+1;j<s.length();j++){
    
    
            if (helper(s,i,j)){
    
    
                max=Math.max(max,j-i+1);
            }else{
    
    // 从start开始的串有重复字符,后面的不用再判断
                break;
            }
        }
    }
    return max;
}

public boolean helper(String s, int start, int end) {
    
    
    Set<Character> set = new HashSet<>(); // 利用set存储不重复的字符
    for (int i = start; i <= end; i++) {
    
    
        char ch=s.charAt(i);
        if (set.contains(ch)){
    
    
            return false;
        }
        set.add(ch);
    }
    return true;
}
③ Ventana corredera
  • Introducción a la ventana deslizante:

Una ventana deslizante es un concepto abstracto que se usa comúnmente en problemas de arreglos / cadenas. Una ventana es un rango de elementos en la matriz / cadena que generalmente se define por los índices de inicio y fin, es decir [i, j)(cerrado a la izquierda, abierto a la derecha). Una ventana deslizante es una ventana que "desliza" sus dos límites en cierta dirección. Por ejemplo, si deslizamos [i, j) hacia la derecha en 11 elementos, entonces se convierte en [i+1, j+1)(izquierda-cerrada, derecha-abierta).

public int lengthOfLongestSubstring(String s) {
    
    
    int len=s.length();
    int i=0,j=0,max=0;
    Set<Character> set=new HashSet<>();
    while(i<len&&j<len){
    
    
       if(!set.contains(s.charAt(j))) {
    
    
           set.add(s.charAt(j++));
           max=Math.max(max,j-i);// 每一步都要更新max
       }else{
    
    
           set.remove(s.charAt(i++));// 去除重复的字符从下一个位置开始查找不重复字符的子串
       }
    }
    return max;
}

Supongo que te gusta

Origin blog.csdn.net/u014454538/article/details/90257502
Recomendado
Clasificación