Método um: o conteúdo B é copiado diretamente para o espaço restante A, e em seguida, classificar a uma aplicação rápida.
complexidade de tempo: O (m + n) log (m + n)
de código é como se segue:
class Solution:
def merge(self, A, m, B, n):
A[m:] = B
A.sort()
return A
Método dois: o ponteiro duplo
usando dois ponteiros estão a apontar para duas matrizes A e B, a partir do início dos elementos da matriz de dois tamanhos, pequeno tipo em uma nova matriz, o
código é como se segue:
class Solution:
def merge(self, A, m, B, n):
a = 0
b = 0
sort = []
while a < m or b < n:
if a == m:
sort.append(B[b])
b += 1
elif b == n:
sort.append(A[a])
a += 1
elif A[a] <= B[b]:
sort.append(A[a])
a += 1
else:
sort.append(B[b])
b += 1
A[:] = sort
return A
Método três: ponteiro dupla reversa (na modificação in situ, sem o espaço de armazenamento adicional)
para a matriz A e B estão dispostas em matriz ponteiro a, b. um ponto inicial para o último elemento na matriz A, isto é, a = m-1, b indica inicialmente o último elemento na matriz B, isto é, b = n-1; comparar um elemento ponteiro e ponteiro b para tamanho elemento, grande um arranjo mais para uma posição de um elemento (isto é, a m + n-1 posição). E ordem sequencial de elementos de inserção.
Código é a seguinte:
class Solution:
def merge(self, A, m, B, n):
a, b = m - 1, n - 1
tail = m + n - 1
while a >=0 or b >= 0:
if a == -1:
A[tail] = B[b]
b -= 1
# n -= 1
elif b == -1:
A[tail] = A[a]
a -= 1
# m -= 1
elif A[a] <= B[b]:
A[tail] = B[b]
b -= 1
# n -= 1
else:
A[tail] = A[a]
a -= 1
# m -= 1
tail -= 1
return A