В массив1 не добавляются значения массива2 в цикле. По одной из задач с leetcode

Рейтинг: 0Ответов: 1Опубликовано: 24.04.2023
   public static void main(String[] args) {
       int[] test1 = {1,2,3,0,0,0};
       int[] test2 = {2,5,6};
       Main main = new Main();
       main.merge(test1, test1.length, test2, test2.length);
   }
   public void merge(int[] nums1, int m, int[] nums2, int n) {

       int counterN = 0;
       
       for(int j = m; j < n; j++){
           nums1[j] = nums2[counterN];
           counterN++;}

       for (int i:
            nums1) {
           System.out.println(i);

       }

Подскажите, почему в цикле

for nums1[j] = nums2[counterN];

не добавляет в массив nums1 вместо нулей значения из массива nums2?
То есть output получается [1,2,3,0,0,0], хотя предполагал, что будет [1,2,3,2,5,6].

По условию задачи m и n - это длины массивов nums1 и nums2.
У nums1 реальная length на входе в метод m+n, реальная m = 3, n = 3, m+n = 6.

Нулями в массиве nums1 заменены "пустые" ячейки, в которые предполагается в дальнейшем записать числа из массива nums2.

Спасибо!

Ответы

▲ 0

Для простого добавления элементов второго массива в первый после m элементов достаточно переписать цикл и отсортировать заполненный первый массив (почему-то такое решение принимается):

import static java.util.Arrays.sort;

public void merge(int[] a, int m, int[] b, int n) {
    for (int i = m, j = 0; i < a.length;) {
        a[i++] = b[j++];
    }
    sort(a);
}

Если "читерское" использование встроенной / библиотечной сортировки не допускается, как по требованиям к производительности (сложность равна O((m + n) log (m + n))), так и по морально-этическим соображениям, следует поискать более быстрое линейное решение, например, за счёт использования промежуточного массива длиной m + n, содержимое которого затем будет скопировано в исходный первый массив:

public void merge(int[] a, int m, int[] b, int n) {
    // создаем промежуточный массив
    int[] c = new int[m + n]; // or a.length
    
    int i = 0, j = 0, k = 0;
    // записываем по очереди минимальные элементы из a и b, пока один из них не закончится
    while (j < m && k < n) {
        if (a[j] < b[k]) {
            c[i++] = a[j++];
        } else {
            c[i++] = b[k++];
        }
    }
    // копируем остаток первого массива если нужно
    while (j < m) {
        c[i++] = a[j++];
    }
    // копируем остаток второго массива если нужно
    while (k < n) {
        c[i++] = b[k++];
    }
    // перезаписываем содержимое исходного "большого" массива
    for (i = 0; i < a.length; i++) {
        a[i] = c[i];
    }
}