Merge Sorted Array
https://leetcode.com/problems/merge-sorted-array/description/ | Easy |
Условие
У вас есть два отсортированных массива nums1 и nums2, и вам нужно объединить их в один отсортированный массив. Начальный массив nums1 имеет размер m + n, где первые m элементов являются элементами, которые нужно объединить, а последние n элементов равны 0. Массив nums2 имеет размер n.
Примеры
Input:
nums1 = [1, 2, 3, 0, 0, 0], m = 3, nums2 = [2, 5, 6], n = 3Output:
[1, 2, 2, 3, 5, 6]Explanation:
Объединенный отсортированный массив — [1, 2, 2, 3, 5, 6].
Input:
nums1 = [1], m = 1, nums2 = [], n = 0Output:
[1]Explanation:
Массив nums2 пустой, поэтому nums1 остается без изменений.
Input:
nums1 = [0], m = 0, nums2 = [1], n = 1Output:
[1]Explanation:
Массив nums1 изначально пуст, поэтому результатом будет nums2.
Решение
fun merge(nums1: IntArray, m: Int, nums2: IntArray, n: Int) {
var i = m - 1 // Индекс последнего элемента в nums1
var j = n - 1 // Индекс последнего элемента в nums2
var k = m + n - 1 // Индекс последнего места в nums1 для слияния
// Проходим с конца обоих массивов и вставляем наибольший элемент на текущее место в nums1
while (i >= 0 && j >= 0) {
if (nums1[i] > nums2[j]) {
nums1[k--] = nums1[i--] // Если текущий элемент в nums1 больше, ставим его на место
} else {
nums1[k--] = nums2[j--] // Если текущий элемент в nums2 больше или равен, ставим его на место
}
}
// Если в nums2 остались элементы, переносим их в nums1
// (если i < 0, то nums1 уже полностью заполнен)
while (j >= 0) {
nums1[k--] = nums2[j--]
}
}
Временная сложность
O(m + n) — требуется один проход по двум массивам.
Пространственная сложность
O(1) — дополнительная память не используется, все происходит на месте.