Preguntas de entrevista escritas: suma de dos números y suma de tres números

      Publicado originalmente en:

 

 

      La suma de dos números (suma de dos) es una pregunta típica de una entrevista escrita, y también es la primera pregunta de LeetCode. Para facilitar la descripción, simplifico la pregunta original:

      Dada una matriz a [N], determine si la suma de dos elementos es k.

 

Algoritmo 1: bucle de dos capas

     Para cada a [i], recorremos la matriz a [N] nuevamente y luego determinamos si el valor de a [i] + a [j] es igual a k, donde j> i. Este es el método más intuitivo y violento solución. La complejidad del tiempo es O (N * N) y la complejidad del espacio es O (1).

      Si responde de esta forma, aunque es correcta, definitivamente suspenderá la entrevista escrita.

     Analice, para cada a [i], en el proceso de encontrar una a [j] razonable, se utiliza la búsqueda lineal. Obviamente es un acierto. ¿Por qué no utilizar la búsqueda hash?

 

Algoritmo 2: bucle de una sola capa + tabla hash

      Mejoremos el algoritmo 1:

     Para cada a [i], debe encontrar el valor de ka [i] en la matriz a [N], y la búsqueda más rápida es una búsqueda hash (la complejidad del tiempo es O (1)). Por lo tanto, la complejidad del tiempo general El grado es O (N). Dado que se usa una tabla hash, la complejidad del espacio también es O (N).

     Esta práctica de intercambiar espacio por tiempo se utiliza a menudo. Esta solución es para cumplir con los requisitos de la entrevista escrita.

     El código se implementa de la siguiente manera (el resultado es el subíndice del valor que cumple la condición):

func twoSum(nums []int, target int) []int {
    var result []int
    m := make(map[int]int)
    lenN := len(nums)
    for i, v := range nums {
        m[v] = i
    }

    for i := 0; i <  lenN; i++ {
        if j, ok := m[target - nums[i]]; ok && i < j {
            result = append(result, i, j)
        }
    }

    return result
}

      Los resultados de la prueba son los siguientes:

 

     El código anterior, aunque es un bucle de una sola capa, pero el bucle se usa dos veces, de hecho, puede continuar optimizándose y unificando en un bucle. Esta optimización no es difícil, así que no la repetiré.

 

Algoritmo 3: clasificación rápida + doble puntero

      ¿Qué sucede si se requiere que la complejidad del espacio sea O (logN) y la complejidad del tiempo es lo más baja posible?

      Puede considerar la clasificación rápida y el método de doble puntero, de la siguiente manera:

      Paso 1: clasificación rápida

      Paso 2: Fuerza de sujeción de doble puntero, como sigue:

      La condición del bucle es while (izquierda <alta):

      Si a [izquierda] + a [derecha] resulta ser igual a k, entonces se encuentran dos números cuya suma es k.

      Si a [izquierda] + a [derecha] es menor que k, entonces izquierda ++, intente con un número mayor.

      Si a [izquierda] + a [derecha] es mayor que k, entonces righ--, intente con un número menor. 

      

     Esta solución también es bastante inteligente: la complejidad del tiempo total es O (N * logN) y la complejidad del espacio es O (logN), que también puede cumplir con los requisitos de las entrevistas escritas.

     

 

     La suma de dos números se discutió anteriormente, entonces, ¿cómo lidiar con el problema de la suma de tres números? Obviamente, también hay tres métodos:

     Algoritmo 1: bucle de tres capas (esta solución violenta no puede pasar la entrevista escrita)

     La complejidad del tiempo es O (N * N * N) y la complejidad del espacio es O (1).

 

     Algoritmo 2: bucle doble + tabla hash

     La complejidad del tiempo es O (N * N) y la complejidad del espacio es O (N).

 

     Algoritmo 3: clasificación rápida + doble puntero

     La complejidad del tiempo es O (N * N) y la complejidad del espacio es O (logN).

 

 

     A los entrevistadores de Alibaba, Tencent y Toutiao les gusta mucho Leetcode. Desearía tener mi oferta favorita.

 

Supongo que te gusta

Origin blog.csdn.net/stpeace/article/details/108921742
Recomendado
Clasificación