Tabla de contenido
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:
Optimizació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.
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
-
Los códigos grises no son únicos, solo se debe devolver un tipo. El tema involucra la ley del cambio numérico (solo un bit a la vez) y la conversión binaria.
Solución de problemas de referencia https://leetcode-cn.com/problems/gray-code/solution/xiang-xi-tong-su-de-si-lu-fen-xi-duo-jie-fa-by–12/ , dinámico El método de planificación es muy inteligente. -
Usamos derivación. Solo cambia un bit cada vez y el primer "1" que se encuentra desde la izquierda en el sistema binario se cambia a "0".
Referencia:
https://cloud.tencent.com/developer/article/1407014 -
La fórmula de conversión del código Gray de expresión binaria también se proporciona en la solución, y el código también se puede escribir directamente.
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)