Directorio de artículos
88. Combinar dos matrices ordenadas
tema
Se le dan dos matrices nums1
y orden no decreciente nums2
, y dos números enteros m
y n
, nums1
que indican nums2
el número de elementos en y, respectivamente.
Fusione nums2
en nums1
, de modo que la matriz fusionada también organice en orden no decreciente.
Nota: En última instancia, la función no debe devolver la matriz fusionada, sino almacenarla en la matriz nums1. Para hacer frente a esta situación, la longitud inicial de nums1 es m + n, donde los primeros m elementos representan elementos que deben fusionarse y los últimos n elementos son 0 y deben ignorarse. nums2 tiene una longitud n.
ideas para resolver problemas
Similar a la idea de la clasificación por inserción, saque nums2
los elementos en orden de izquierda a derecha, colóquelos en nums1
el último bit del bit efectivo de la matriz (excluyendo el relleno 0), y luego compárelos uno por uno, y canjearlos si son menores que el número anterior, hasta que se cumplan los requisitos en orden ascendente. (Tal vez es una pregunta simple, el tiempo dedicado a resolver el problema esta vez es bastante pequeño hhh).
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.
"""
for i in range(n):
nums1[m+i] = nums2[i]
for j in range(m+i, 0, -1):
if nums1[j] < nums1[j-1]:
nums1[j], nums1[j-1] = nums1[j-1], nums1[j]
else:
break
Ideas para resolver problemas 【Aprendizaje】
inserción de la cola
Como su nombre lo indica, los elementos se insertan desde el final de la matriz. Defina i、j、k
tres índices, juzgue el tamaño de nums2[j]
y , luego insértelos en (cola) y luego muévase hacia adelante; luego insértelos en y luego muévase hacia adelante.nums1[i]
nums2[j]>=nums1[i]
nums2[j]
nums1[k]
j、k
nums2[j]<nums1[i]
nums1[i]
nums1[k]
i、k
Después de entender, la solución que escribí:
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.
"""
i = m-1
j = n-1
k = m + n -1
while j >= 0:
if i == -1: # 此时nums2剩余的数直接填充到nums1前部
nums1[k] = nums2[j]
j -= 1
elif nums2[j] >= nums1[i]:
nums1[k] = nums2[j]
j -= 1
elif nums2[j] < nums1[i]:
nums1[k] = nums1[i]
i -= 1
k -= 1
Oficialmente dado:
class Solution:
def merge(self, nums1, m, nums2, n):
# 尾插入法
if (n < 1):
return
if (m < 1):
nums1[0:n] = nums2[0:n]
return
k = m + n - 1
i = m - 1
j = n - 1
while k >= 0:
if (nums1[i] > nums2[j] and i >= 0) or (j < 0 and i >= 0):
nums1[k] = nums1[i]
k -= 1
i -= 1
if (nums2[j] >= nums1[i] and j >= 0) or (i < 0 and j >=0):
nums1[k] = nums2[j]
k -= 1
j -= 1
167. Suma de dos números II - Matriz ordenada de entrada
tema
Se le proporciona una matriz de enteros cuyos subíndices 1
comienzan numbers
y la matriz se ha organizado en orden no decreciente. Busque dos números de la matriz que satisfagan la suma target
de Si estos dos números se configuran para ser numbers[index1]
y numbers[index2]
, entonces 1 <= index1 < index2 <= numbers.length
.
Devuelve la suma con subíndice de estos dos enteros como una matriz de enteros 2
de .[index1, index2]
index1
index2
Puede suponer que cada entrada corresponde a una respuesta única y no puede reutilizar los mismos elementos.
La solución que diseñe debe usar solo una cantidad constante de espacio adicional.
ideas para resolver problemas
Dos punteros, muy simple. Ir directamente al código:
class Solution:
def twoSum(self, numbers: List[int], target: int) -> List[int]:
i = 0
j = len(numbers) - 1
while True:
sum_ij = numbers[i] + numbers[j]
if sum_ij == target:
break
if sum_ij > target:
j -= 1
else:
i += 1
return [i+1, j+1]
125. Verificar palíndromo
tema
Si después de convertir todos los caracteres en mayúsculas a minúsculas y eliminar todos los caracteres no alfanuméricos, la frase se lee igual hacia adelante y hacia atrás. Entonces la frase puede ser considerada como un palíndromo .
Tanto las letras como los números son caracteres alfanuméricos.
Dada una cadena s
, si es un palíndromo, devuélvela true
; de lo contrario, devuélvela false
.
ideas para resolver problemas
Dos punteros chocan. isalnum()
Función para determinar si una cadena contiene solo caracteres alfanuméricos. lower()
La función se utiliza para devolver la forma minúscula de la cadena.
class Solution:
def isPalindrome(self, s: str) -> bool:
i=0
j=len(s)-1
while i < j:
if not s[i].isalnum():
i += 1
continue
if not s[j].isalnum():
j -= 1
continue
if s[i].lower() != s[j].lower():
return False
else:
i += 1
j -= 1
return True
345. Vocales inversas en una cadena
tema
Dada una cadena s
, simplemente invierta todas las vocales en la cadena y devuelva la cadena resultante.
Las vocales están incluidas 'a'、'e'、'i'、'o'、'u'
y pueden aparecer más de una vez tanto en mayúsculas como en minúsculas.
ideas para resolver problemas
También use punteros en colisión.
class Solution:
def reverseVowels(self, s: str) -> str:
i = 0
j = len(s) - 1
vowels = ['a', 'e', 'i', 'o', 'u']
s_list = list(s)
while i < j:
if s[i].lower() in vowels:
if s[j].lower() in vowels:
s_list[i], s_list[j] = s_list[j], s_list[i]
i += 1
j -= 1
else:
j -= 1
else:
i += 1
return ''.join(s_list)