給定兩個大小為 m 和 n 的正序(從小到大)數(shù)組 nums1 和 nums2。請你找出并返回這兩個正序數(shù)組的中位數(shù)祭刚。
進階:你能設計一個時間復雜度為 O(log (m+n)) 的算法解決此問題嗎?
示例 1:
輸入:nums1 = [1,3], nums2 = [2]
輸出:2.00000
解釋:合并數(shù)組 = [1,2,3] 捡硅,中位數(shù) 2
示例 2:
輸入:nums1 = [1,2], nums2 = [3,4]
輸出:2.50000
解釋:合并數(shù)組 = [1,2,3,4] 昼牛,中位數(shù) (2 + 3) / 2 = 2.5
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/median-of-two-sorted-arrays
解題思路
類似于歸并排序中的歸并,用兩個指針指向兩個數(shù)組雕擂,每次將小的取出來放到新數(shù)組,當其中一個數(shù)組遍歷完贱勃,則將另一個數(shù)組剩余元素全部放到新數(shù)組剩余空間捂刺,返回新數(shù)組的中位數(shù)即可
代碼
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length, l = m + n;
int[] nums = new int[l];
int i = 0, j = 0, k = 0;
while (i < m && j < n) {
if (nums1[i] < nums2[j]) {
nums[k++] = nums1[i++];
} else {
nums[k++] = nums2[j++];
}
}
while (i < m) {
nums[k++] = nums1[i++];
}
while (j < n) {
nums[k++] = nums2[j++];
}
if (l % 2 == 0) {
return (nums[l / 2 - 1] + nums[l / 2]) / 2.0;
} else {
return nums[l / 2];
}
}
}