Вопрос:
ссылка: https://leetcode.com/problems/median-of-two-sorted-arrays/
Имея два отсортированных массива nums1 и nums2 размером m и n соответственно, верните медиану двух отсортированных массивов.
Общая сложность времени выполнения должна быть O(log (m+n)).
Пример 1:
Input: nums1 = [1,3], nums2 = [2] Output: 2.00000 Explanation: merged array = [1,2,3] and median is 2.
Пример 2:
Input: nums1 = [1,2], nums2 = [3,4] Output: 2.50000 Explanation: merged array = [1,2,3,4] and median is (2 + 3) / 2 = 2.5.
Ограничения:
nums1.length == mnums2.length == n0 <= m <= 10000 <= n <= 10001 <= m + n <= 2000-106 <= nums1[i], nums2[i] <= 106
Решение:
Подход: Конечно! Предоставленный код является решением проблемы нахождения медианы двух отсортированных массивов, nums1 и nums2. Вот разбивка кода:
- Метод
findMedianSortedArraysпринимает два отсортированных целочисленных массиваnums1иnums2в качестве входных данных и возвращает медианное значение как двойное. - Он инициализирует переменные
mиnдля хранения длинnums1иnums2соответственно. - Массив
tempсоздается с размером, равным сумме длинnums1иnums2. Этот массив будет использоваться для объединения двух отсортированных массивов. - Переменные
i,jиkинициализируются для отслеживания индексовnums1,nums2иtempсоответственно. - Код обрабатывает крайние случаи, когда один из массивов имеет только один элемент. Если
tempимеет только один элемент, аnums1имеет один элемент, этот элемент возвращается как медиана. Точно так же, еслиtempимеет только один элемент, аnums2имеет один элемент, этот элемент возвращается как медиана. - Затем код объединяет два отсортированных массива
nums1иnums2в массивtempс помощью цикла while. Он сравнивает элементы с текущими индексамиiиjизnums1иnums2соответственно. Меньший элемент добавляется кtemp, а соответствующий индекс (iилиj) увеличивается. Индексkтакже увеличивается, чтобы отслеживать позицию вtemp. - После объединения массивов любые оставшиеся элементы в
nums1илиnums2добавляются вtempс помощью двух отдельных циклов while. - Переменная
midвычисляется как сумма длинnums1иnums2, деленная на 2. Она представляет средний индексtempи используется для нахождения медианы. - Если общее количество элементов в
tempчетное (temp.length % 2 == 0), аmidбольше 0, это означает, что есть два средних элемента. В этом случае медиана рассчитывается путем получения среднего значения в точкахtemp[mid]иtemp[mid - 1]. - Если общее количество элементов в
tempнечетное, медиана — это просто значение вtemp[mid]. - Наконец, медианное значение возвращается как двойное.
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length;
int n = nums2.length;
int[] temp = new int[m+n];
int i=0, j=0, k=0;
if(temp.length == 1 && m ==1){
return nums1[0];
}
if(temp.length == 1 && n==1){
return nums2[0];
}
while(i<m && j<n){
if(nums1[i] < nums2[j]){
temp[k] = nums1[i];
i++;
}else{
temp[k] = nums2[j];
j++;
}
k++;
}
while(i<m){
temp[k] = nums1[i];
i++;
k++;
}
while(j<n){
temp[k] = nums2[j];
j++;
k++;
}
int mid = m+n;
mid = mid/2;
if(temp.length%2 == 0 && mid > 0){
double ans = temp[mid] + temp[mid-1];
ans = ans/2;
return ans;
}else{
return temp[mid];
}
}
}
Временная сложность: O(m+n)
Космическая сложность: O(m+n)
Заключение:
Надеюсь, что этот блог поможет вам решить вопрос, а также развеет ваши сомнения относительно решения. Пожалуйста, прокомментируйте, если вы знаете какие-либо новые подходы. Если у вас есть какие-либо сомнения, пожалуйста, прокомментируйте, и мы обсудим их.
Удачного кодирования.