1 pregunta:
Se le proporcionan dos matrices de números enteros nums1 y nums2 dispuestas en orden no decreciente, y dos números enteros myn, que representan el número de elementos en nums1 y nums2 respectivamente.
Fusione nums2 en nums1 para que la matriz fusionada también esté organizada 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. La longitud de nums2 es n.
2.Ideas:
Simplemente compare los elementos más grandes de las dos matrices cada vez.
① Primero, tome los elementos más grandes en las dos matrices para comparar. El elemento más grande se coloca en la posición m+n-1 de la matriz num1. Luego se resta el índice de posición original (m o n) del elemento actual y el propósito es hacia abajo. Un elemento a comparar, y nuestro índice de posición vacía num1 también debe restarse, con el propósito de apuntar a la siguiente posición vacía. Usamos m+n-1 para representar el índice de posición vacía aquí. Cuando Se resta m o n. El índice de posición vacía también se reducirá en consecuencia;
② Es necesario repetir este proceso de comparación, ¿cuándo finalizará? Cuando la posición de comparación ha llegado al extremo izquierdo, es decir, cuando el índice es 0, ya no podemos comparar, porque m-1 y n-1 aquí son los índices respectivos de las dos matrices, y la condición del bucle es m > 0 && n > 0, siempre que se recorra una matriz hasta el final, salga del ciclo;
③ Después de que sale el ciclo, si no se cumplen las condiciones, si n <0, pero m>0 o tanto n como m son menores que 0, significa que todos los elementos en num2 se han insertado en num1 y la fusión se completa en este momento;
④ Si m<0, pero n>0, esta situación significa que todos los elementos en num1 han sido comparados y solo los elementos en num2 quedan esperando ser insertados, por lo que en este momento también necesitamos un bucle while para comparar los elementos en num2 Insertar en num1 a su vez. El índice de posición vacía sigue siendo m + n-1. Cada vez que n se resta hasta que n sea igual a 0.
3. Implementación del código:
class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {
while (m > 0 && n > 0) {
if(nums1[m - 1] > nums2[n - 1]) {
nums1[m + n - 1] = nums1[m - 1];
m--;
} else {
nums1[m + n - 1] = nums2[n - 1];
n--;
}
}
while (n > 0) {
nums1[m + n - 1] = nums2[n - 1];
n--;
}
}
}