Leetcode-día4【88】【167】【125】【345】

88. Combinar dos matrices ordenadas

tema

Se le dan dos matrices nums1y orden no decreciente nums2, y dos números enteros my n, nums1que indican nums2el número de elementos en y, respectivamente.

Fusione nums2en 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 nums2los elementos en orden de izquierda a derecha, colóquelos en nums1el ú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

imagen-20230422114856472

Como su nombre lo indica, los elementos se insertan desde el final de la matriz. Defina i、j、ktres í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、knums2[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 1comienzan numbersy la matriz se ha organizado en orden no decreciente. Busque dos números de la matriz que satisfagan la suma targetde 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 2de .[index1, index2]index1index2

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)

おすすめ

転載: blog.csdn.net/qq_39784672/article/details/130309811