Notas de estudio de TLP-Task09


Este artículo es el 21º grupo de temas seleccionados de LeetCode, notas de estudio Task09 del plan de estudio del equipo Datawhale.
Para los principiantes, el tiempo es un poco apresurado, muchas soluciones no se analizan en detalle y pueden ser revisadas en el futuro, perdóname.
Documento de aprendizaje de Datawhale:
https://github.com/datawhalechina/team-learning-program/tree/master/LeetCodeTencent

088 fusiona dos matrices ordenadas

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/merge-sorted-array

Proporcione dos matrices de enteros ordenados nums1 y nums2, por favor combine nums2 en nums1 para hacer nums1 una matriz ordenada .
Inicialice el número de elementos de nums1 y nums2 am y n respectivamente. Puede suponer que el tamaño del espacio de nums1 es igual am + n, por lo que tiene suficiente espacio para almacenar los elementos de nums2.

Ejemplo:

Entrada: nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
Salida: [1,2,2,3,5,6]
Entrada: nums1 = [1], m = 1, nums2 = [], n = 0
Salida: [1]

Ideas

Consulte la solución oficial (el chiste hhh en el primer sello en el área de comentarios) para
ver el orden, luego la dicotomía , considere el método de doble puntero e intente comparar el tamaño en la incertidumbre. Tenga en cuenta que es necesario fusionar el título en nums1.
Los punteros se colocan al principio de las matrices nums1 y nums2, y el valor mínimo se compara y se coloca en la matriz de salida.
Diagrama de solución oficial:
Antes de la optimizaciónOptimización: Si la matriz se modifica desde el principio, para evitar afectar los datos posteriores, los datos de nums1 deben almacenarse con anticipación (lo que equivale a crear una nueva matriz). Cámbielo directamente desde el final para ahorrar espacio.
Optimizado

Implementación de Python

class Solution:
    def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
        """
        Do not return anything, modify nums1 in-place instead.
        """
        p1 = m - 1      # p1,p2分别指向两个数组的末尾
        p2 = n - 1
        p = m + n - 1   # 从末尾开始从小到大填入元素
        
        while p1 >= 0 and p2 >= 0:
            if nums1[p1] < nums2[p2]:
                nums1[p] = nums2[p2]
                p2 -= 1
            else:
                nums1[p] =  nums1[p1]
                p1 -= 1
            p -= 1

        nums1[:p2 + 1] = nums2[:p2 + 1]	# 合并
        

089 Código Gray

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/gray-code

La codificación gris es un sistema numérico binario en el que dos valores consecutivos difieren en un solo dígito .
Dado un número entero no negativo n que representa el número total de dígitos en el código, imprima su secuencia de código Gray. Incluso si hay varias respuestas diferentes, solo necesita devolver una de ellas .
La secuencia del código Gray debe comenzar con 0.

Ejemplo:

Entrada: 2
Salida: [0,1,3,2]

Entrada: 0
Salida: [0]

Explicación:
00 - 0
01 -. 1.
11 -. 3
10 - 2
para una secuencia de codificación gris n dada que no es única .
Por ejemplo, [0,2,3,1] también es una secuencia de código Gray válida.
00-0
10 - 2
11 - 3
01 - 1

Además, definimos que la secuencia del código Gray debe comenzar con 0 .
Dada una secuencia de código Gray con un número total de dígitos de n, su longitud es 2n . Cuando n = 0, la longitud es 20 = 1.
Por lo tanto, cuando n = 0, su secuencia de código Gray es [0].

Ideas

Implementación de Python

(El código es más problemático, pero personalmente lo encuentro fácil de entender, consulte el final del artículo para conocer los operadores de bits)

class Solution:
    def grayCode(self, n: int) -> List[int]:
        res = []
        size = 1 << n   # 位运算符,二进制下,从右侧推入零来推动最左边的位。
        for i in range(size):
            res.append((i >> 1) ^ i)
        return res
        

104 Profundidad máxima del árbol binario

Fuente: LeetCode
Enlace: https://leetcode-cn.com/problems/maximum-depth-of-binary-tree

Dado un árbol binario, encuentre su profundidad máxima.
La profundidad del árbol binario es el número de nodos en la ruta más larga desde el nodo raíz hasta el nodo hoja más lejano.
Explicación: Un nodo hoja se refiere a un nodo sin nodos secundarios.

Ejemplo:

Dado un árbol binario [3,9,20, null, null, 15,7],
3
/ \
9 20
/ \
15 7

Devuelve su profundidad máxima 3.

Ideas

La solución oficial del problema ofrece dos métodos: recursividad y búsqueda primero en amplitud (de hecho, primero hay profundidad y así sucesivamente).

Implementación de Python

La recursividad es relativamente simple (la definición de un árbol binario se da al comienzo del código)

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def maxDepth(self, root: TreeNode) -> int:
        if root is None: 
            return 0 
        else: 
            left_height = self.maxDepth(root.left) 
            right_height = self.maxDepth(root.right) 
            return max(left_height, right_height) + 1 

Conocimientos complementarios

Operador de bits

https://www.runoob.com/python/python-operators.html
https://www.w3school.com.cn/python/python_operators.asp
<<
Operador de desplazamiento a la izquierda: todos los bits binarios del operando se desplazan al left Varios dígitos, el número a la derecha de << especifica el número de dígitos a mover, el dígito alto se descarta y el dígito bajo se llena con 0.
Por ejemplo, a = 60, binario 0011 1100
a << 2 resultado de salida 240, interpretación binaria: 1111 0000
<< =
operador de asignación, x << = 3, que es x = x << 3

Estos dos operadores se pueden utilizar para realizar cálculos binarios de manera más conveniente. Por ejemplo, en el código de este artículo, tamaño = 1 << n, si n = 4, desplazarse a la izquierda 4 bits, de 1 a 10000, que es 16 (los bits altos se descartan y los bits bajos se rellenan con 0)

Supongo que te gusta

Origin blog.csdn.net/cosima0/article/details/112914730
Recomendado
Clasificación